字符编码

字符编码小结

今天主要学写了字符编码的由来,意义,以及Python中关于字符编码的重要方法。

主要内容

  • 字符编码的介绍
  • 字符编码表
  • Unicode
  • Python中的字符编码

 

字符编码的介绍

  字符编码,把名字拆开来看,字符和编码,字符就表明了这种编码方式是针对文字的,而编码,编成什么码呢,那就是二进制码。为什么要编成二进制码呢,简单的从计算机的工作原理来介绍,计算机内部是利用电来工作的,电在计算机里只存在高低电平,对应逻辑的1和0,所以在计算机的世界里只存在01两种数字,即计算机只能识别二进制数字。再从一个文本编辑器的工作原理上看,文本编辑器读取一个文本文件的内容并显示主要分为以下3步:

  1. 将文本编辑器的代码从硬盘中读取到内存中

  2. 文本编辑器从硬盘中读取文本到内存中

  3. 显示相应内容

  以上第二步中,计算机内存中只能存在二进制数据,而文本内容是不可能存在于内存中的,所以这中间就必须存在一种映射关系,让每一个文本字符对应一个二进制码值,进而就能把文本内容读入到内存中了。而这个字符与对应的二进制码值的映射表就是字符编码表。

字符编码表

  计算机是由美国发明的,所以第一个字符编码表就是美国人发明的ASCII字符编码表,ASCII表只能对应于26个英文字符、阿拉伯数字和一些特殊字符等。

  而我们中国汉字拥有这么多的汉字,ASCII码表远远不能表示中文汉字,所以中国人发明了自己的GBK字符编码表,每一个汉字用两个字节来表示,同时能够兼容英文字符。

  同样如日本人发明了适用于他们自己语言的码表Shift-JIS等等。

Unicode

  各国都拥有自己的字符编码表,这就造成了各国之间相互交流的困难,每个国家使用自己的编码表去解析别人的编码后的字符就会出现乱码,这时候就需要一种通用的可以包含全世界的字符编码表来解决这种现状。万国码Unicode便应运而生,它占固定两个字节,可以包含全世界所有国家的语言符号。

  Unicode虽然统一了全世界的字符编码表,但是Unicode有两个很大的缺点

  1. 如果文档中全是由英文字符编写的,用ASCII表完全可以胜任,这就造成了存储空间的浪费

  2. 2个字节也造成了计算机IO次数增加,使得程序运行效率降低很多,这也是Unicode最大的缺点

  为了解决Unicode的缺点,可变字节长度的utf-8编码便是对Unicode的改进,而Unicode也便只在内存中使用了,即我们现在保存文件时一般用utf-8格式,当把文本文件从硬盘读取到内存中时,会解码成Unicode码。

Python中的字符编码

  Python解释器执行程序的基本流程与普通文本编辑器基本类似

  1. 运行Python解释器,将之读入到内存中

  2. Python解释器读取对应的Python文件

  3. 执行解析Python文件

  在第二步中,尤其要注意当初保存Python文件时使用的编码格式,例如使用gbk编码表保存Python代码,那么Python解释器解析该文件时必须使用对应的gbk编码来解码,否则就会报编码错误。在Python3中,解释器默认的编码是utf-8,Python2 是ASCII表,而这就要求必须在Python文件开头指定GBK编码,需要加上以下一行来告诉解释器用什么编码方式来解码。

  # coding=gbk

  Python中的将字节串解码成Unicode的方法是decode.

  将Unicode编码成指定编码方式的二进制字节串的方法是encode

小结

  在Python中,只要记住用什么字符编码表编码的就用什么解码,出现了乱码,就是使用的编码表不正确。记住从内存中将数据存储到硬盘中,是将Unicode编码成指定字符编码的字节串,用的是encode方法,将例如从网络中传输来的字节串,或是从硬盘中读取到的字节串都需要使用decode方法解码成Unicode,然后读入到内存中。

 

posted @ 2019-07-05 20:53  yscl  阅读(122)  评论(0)    收藏  举报