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 = 65536unicode包含了跟全球所有国家编码的映射关系(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 执行代码的过程

  1. 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成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是乱码。

总结:

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'>

++++++++++++++++++++++++++++++++++++

 

posted @ 2018-03-14 15:41  Sin-是我的海  阅读(200)  评论(0)    收藏  举报