第二章—编码

Posted james201133002

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章—编码相关的知识,希望对你有一定的参考价值。

计算机容量:

在ASSIC中  每一个字符统一都需要8个bit来存储

技术分享图片

 

1位 = 1bit
8bit = 1byte = 1字节
1024bytes = 1kbytes =1KB 1024个字符
1024KB = 1Million Bytes = 1MB = 1兆
1024MB = 1G
1024GB = 1TB
1024TB = 1PB

字符编码:

  • ASCII 占1个字节,只支持英文
  • GB2312 占2个字节,支持6700+汉字
  • GBK GB2312的升级版,支持21000+汉字
  • unicode 万国码  支持所有国家和地区的编码,2-4字节,汉字一般2个字节
  • UTF-8  使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
  • 总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。

Python3的执行过程:

  1. 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成Unicode(自动转成Unicode)
  2. 把代码字符串按照语法规则进行解释,
  3. 所有的变量字符都会以unicode编码声明

技术分享图片

 

 上面的utf-8编码之所以能在windows gbk的终端下显示正常,是因为到了内存里python解释器把utf-8转成了unicode , 但是这只是python3, 并不是所有的编程语言在内存里默认编码都是unicode,比如 万恶的python2 就不是, 它的默认编码是ASCII,想写中文,就必须声明文件头的coding为gbk or utf-8, 声明之后,python2解释器仅以文件头声明的编码去解释你的代码,加载到内存后,并不会主动帮你转为unicode,也就是说,你的文件编码是utf-8,加载到内存里,你的变量字符串就也是utf-8, 这意味着什么你知道么?。。。意味着,你以utf-8编码的文件,在windows是乱码。

Python2中默认的字符串编码是ASCII码,加载到内存中不会自动转成Unicode。

因为只有2种情况 ,在windows上显示才不会乱

  1. 字符串以GBK格式显示
  2. 字符串是unicode编码

这就需要用到encode(转码)和decode(解码)

UTF-8 --> decode 解码 --> Unicode
Unicode --> encode 编码 --> GBK / UTF-8 ..

 

 技术分享图片

 

 先decode()成Unicode,括号中加的编码就是文件头编码,告诉python2这是用什么编码写的程序。

 

技术分享图片

把Unicode编码成GBK,这样就可以显示中文了。

 

 

总结:

1、python3文件编码默认是utf-8,字符串编码默认是Unicode,默认支持中文,加载到内存中是字符串,编码是Unicode,自动转成GBK显示。

2、pyrhon2文件编码和字符串编码默认都是ASCII码,默认不支持中文,需要在文件头上加上或者进行解码和编码:

# -*- coding: UTF-8 -*- 技术分享图片
#coding=utf-8

3、保存的文件是什么编码就需要用什么编码打开否则会乱码。

技术分享图片

 

 

 

Python只要出现各种编码问题,无非是哪里的编码设置出错了
常见编码错误的原因有:

      • Python解释器的默认编码
      • Python源文件文件编码
      • Terminal使用的编码
      • 操作系统的语言设置

 









以上是关于第二章—编码的主要内容,如果未能解决你的问题,请参考以下文章

分享几个实用的代码片段(第二弹)

分享几个实用的代码片段(第二弹)

《安富莱嵌入式周报》第279期:强劲的代码片段搜索工具,卡内基梅隆大学安全可靠C编码标准,Nordic发布双频WiFi6 nRF7002芯片

第二次在对话框中膨胀片段时出错

以下代码片段 C++ 的说明

*** Bool 编码为数字属性列表片段。属性列表编码器