Python基础---二进制与字符编码
ASCII码可以表示0--255 一共256个字符
例如字符a -- 是用十进制97 表示,在计算机内部再转换成二进制。

1.把文字转换成二进制
把 #Alex 装换成二进制,对应的ASCii 码为

ASCII码 表示最大的十进制是255,用二进制表示为8位。计算机默认是每8位识别为一个字符,因此二进制不够8位的填0 补充。

每个二进制位(0或者1) 所占的单位为1bit

2.字符编码的演化
- 汉字相关编码进化,windows 默认是GBK

Unicode :为解决不同国家间的编码不互通的问题,出现了unicode(万国码),将国际所有语言的每个字符定义一个唯一编码,可跨平台使用。 每个字符至少16位表示(即2bytes),2**16 = 65536 。 unicode包含了跟全球所有国家编码的映射关系(unicode --- gbk) UTF-8 :是对unicode 的优化和压缩。ascii 码中的字符用一个字节表示,欧洲的字符两个字节表示,东亚的字符三个字节表示。 目的:为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!
- UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
- UTF-32: 使用4个字节表示所有字符;
编码的转换
以何种字符编码存储到硬盘,读取的时候就应该以何种编码。比如ascii码 一个字节表示一个字符,如果用gbk 两个字节来解析就会出问题。
如果中国的软件出口到日本,在日本人的电脑上就会显示乱码,因为他们没有gbk编码。解决办法如下:
- 让美国人的电脑上都装上gbk编码(unicode)
- 把你的软件编码以utf-8编码
针对已经用gbk开发完毕的项目,unicode其中一个功能是其包含了跟全球所有国家编码的映射关系.。
比如:gbk的“路”,编码是4237 --- 对应unicode 的编码是8DEF 。在unicode中就出显示出8DEF 对应的字符也是“路”
如果这样的话,无论你以什么编码存储的数据 ,只要你的软件在把数据从硬盘读到内存里,转成unicode来显示,就可以了。
3.python 的字符编码
python2 默认使用的是ascii码解释程序里的代码,如果在文件头里不指定字符集就可能报错。python3 默认使用的是utf8.
#! -*- coding:utf-8 -*- 或者 #! encoding: utf-8
python3 执行代码的过程
- 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
- 把代码字符串按照语法规则进行解释,
- 所有的变量字符都会以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是乱码。

总结:
Python3 文件默认编码是utf8 ,内存中字符串编码是unicode
Python3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分, str 就是unicode格式的字符, bytes就是单纯二进制。
Python2 文件默认编码是ascii,内存中字符串编码是ascii。如果文件头声明了gbk,那字符串编码是gbk。(在内存中就是gbk)
Python2 中有单独的unicode 类型,如:
>>> s = "路飞" >>> s '\xe8\xb7\xaf\xe9\xa3\x9e' #在windows下是gbk格式无法显示指定的utf8格式的代码内容 >>> s2 = s.decode("utf-8") #将utf8格式的代码解码成unicode,在任何编码的终端下都可以正常显示 >>> s2 u'\u8def\u98de' >>> type(s2) <type 'unicode'>
++++++++++++++++++++++++++++++++++++
浙公网安备 33010602011771号