python基础——字符编码

 一、什么是编码

编码是指信息从一种形式或格式转换为另一种形式或格式的过程。

在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息。众所周知,计算机能够读懂的是高低电平,也就是二进制位(0,1组合)。

而解码,就是指将计算机的能够读懂的信息转换为人能够读懂的信息。

二、编码种类

  • ASCII 占1个字节,只支持英文GB2312 占2个字节,支持6700+汉字
  • GB2312 占2个字节,支持6700+汉字
  • GBK GB2312的升级版,支持21000+汉字
  • Shift-JIS 日本字符
  • ks_c_5601-1987 韩国编码
  • TIS-620 泰国编码

三、 Unicode的出现和演变

  因为每个国家都有自己的一套的字符编码,当所制作的软件出到国外,软件无法正常显示,正是如此Unicode应运而生,它包含了全球的全部字符,称为万国码

  Unicode主要起了两个作用:

    1. 支持全球的语言,统一编码。
    2. unicode包含了全球所有国家编码的映射关系

  但是Unicode对于使用ACSII编码的软件不大友好,因为在ACSII编码中,一个英文字符只需要一个字节,而Unicode中需要两个字节才可以表示完,这样大大加大了在网络传输和储存的成本。

  为了解决这个问题的出现,1992年出现了UTF-8(8-bit Unicode Transformation Format),节省网络传输和存储等节省空间

  • UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。
  • UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。

  • UTF-32: 使用4个字节表示所有字符。

四、编码的转换

  在出现Unicode和utf-8之前,每个国家都用着自己国家的编码,当Unicode和 utf-8出现后,我们并不能马上改变我们的代码,因为要改变的东西太多了,然后要让我们的软件被国外的使用,我们只有两条路可以走

  1. 让国外的每台电脑装上我们国家的gbk的编码
  2. 让我们的软件以utf-8编码

  显然,第一条路不大好走,而第二种比较好实现。但是第二种只能针对新软件来操作,因为过去的软件已经再次以另一种方式操作会花费许多工程。但是我们可以把软件的数据从硬盘读到内存里,然后用Unicode表示,这样就可以解决问题了。

五、decode  and  encode 

  在Python2中,默认字符的编码就是ASCII,如果我们想写中文需要在文件头部添加#_*_coding:utf-8 *,这样去声明,但是我们即使在文件头部添加这个信息后,我们依然无法去读取,因为它只是以utf-8去解释我们的文件,加载到内存也还是utf-8.在windows上面的终端,我们读取也是乱码,我们windows是以Unicode和gbk显示的。

  在Python3中,默认字符的编码是utf-8,我们Python3在文件解释时,把我们的文件的编码转为了Unicode,这样我们在终端就可以读取到,因此不会乱码。如果我们想要Python2成功的在我们的终端显示,我们就需要完成Python3偷偷为我们做的事。

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

decode:

encode

记住以下规则

 

验证编码转对

  1. 查看数据类型,python 2 里有专门的unicode 类型
  2. 查看unicode编码映射表

    unicode字符是有专门的unicode类型来判断的,但是utf-8,gbk编码的字符都是str,你如果分辨出来的当前的字符串数据是何种编码的呢? 有人说可以通过字节长度判断,因为utf-8一个中文占3字节,gbk一个占2字节

上面只能大体判断,下面介绍准确方法

下面是  ‘编码’  二字在Unicode映射表的位置

将其全部转为二进制

编
B               1
8   4   2   1   8   4   2   1
1   0   1   1   0   0   0   1
 
E               0
8   4   2   1   8   4   2   1
1   1   1   0   0   0   0   0
 
 
码
C               2
8   4   2   1   8   4   2   1
1   1   0   0   0   0   1   0
 
E               B
8   4   2   1   8   4   2   1
1   1   1   0   1   0   1   1

  

  这样依旧没有对上,但是我们需要把每个二进制的左边第一位全部变成0,发现最后加起来确实如此。

  因为,GBK的编码表示形式决定的。。因为GBK编码在设计初期就考虑到了要兼容ASCII,即如果是英文,就用一个字节表示,2个字节就是中文,但如何区别连在一起的2个字节是代表2个英文字母,还是一个中文汉字呢? 中国人如此聪明,决定,2个字节连在一起,如果每个字节的第1位(也就是相当于128的那个2进制位)如果是1,就代表这是个中文,这个首位是128的字节被称为高字节。 也就是2个高字节连在一起,必然就是一个中文。 你怎么如此笃定?因为0-127已经表示了英文的绝大部分字符,128-255是ASCII的扩展表,表示的都是极特殊的字符,一般没什么用。所以中国人就直接拿来用了。 

总结

  python2的字符串其实更应该称为字节串。 通过存储方式就能看出来, 但python2里还有一个类型是bytes呀,难道又叫bytes又叫字符串? 嗯 ,是的,在python2里,bytes == str。python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode。

  在我看来,每个电脑都有一张编码表  我们把编码解码就是去表里找对应的字符,然后打印出来。

猜你喜欢

转载自www.cnblogs.com/Ojia/p/9426487.html
今日推荐