简谈字符编码

一、定义:字符编码就是字符与计算机可直接识别的数字的对应关系表。

二、应用流程:

  1、存入:通过编辑器产生字符,此时为了能让计算机识别存入内存,需要通过编码表转码,内存存入硬盘时会直接用转后后的计算机数字码存入。

  2、读出:当某程序需要调用内存中字符时,会从硬盘先读入内存,此过程无需转码,程序将内存上的计算机数字码形式的字符解码出来使用。

三、编码表的发展过程

  1、初期:一家独大的ASCII表,只支持英文字符,采用八位二进制数,即1Bytes,对应一个英文字母。

  2、发展:百家争鸣,各国在ASCII表的基础上,发明了除了支持英文,也支持本国语言的编码表,如GBK表支持汉字及英文,Euc-KR表支持韩文及英文,Shift-JIS表支持日文与英文。

    ①以GBK表为例,其中英文的对应关系同于ASCII表,也是1Bytes数字,但是汉字的个数远远多于英文字母,就把汉字对应的数字位数扩展为2Bytes,即十六位二进制数。

  3、目前:回归统一的unicode表,此表可以支持世界上所有语言,每个文字都有对应数字,一般采用2Bytes,个别生僻字会用4Bytes或8Bytes。

    ①因为unicode的出现是较现代的事情,在那之前,有很多老的程序都是以各国自己的编码表转码存入在了硬盘,为了过渡这种情况,unicode表中有定义了与各国表的转换关系,如一个GBK编码的文件,由硬盘读入内存时会根据unicode表与GBK表的转换关系转换为unicode表的数字,读入程序时再根据unicode表转换为人类字符。

人类的字符-----(内存)unicode格式的数字
                     |     |                 
                     |     |                   
                     |     |                  
                     |    |               
                     |     |                   
                     |     |                  
                     |     |                  
             (硬盘)GBK格式的数字 

    ②unicode表的特性时大部分字符以2Bytes的形式转化为数字,这样一来转码后的数据偏大而导致了IO延迟的增加,为了解决这一情况,产生了utf-8表,其特性是会根据字符的种类区分Bytes位数,以缩小数据转码后的大小减少IO延迟。例如一个新文件产生的字符,会先转码为unicode码读入内存,当需要由内存存入硬盘时,再转码为uft-8码,读出则反向该流程。

人类的字符-----(内存)unicode格式的数字
                     |     |
                     |     |
                     |     |
                     |    |
                     |     |
                     |     |
                     |     |
             (硬盘)utf-8格式的数字 

    ③为何utf-8表命名由于unicode表而没有取代之呢?因为unicode表还有utf-8所没有的对各国表的对应功能,所以在近几十年内无法被取代。当这些老文件都不流于世的时候,unicode表会退出舞台,内存和硬盘都使用utf-8表。

四、乱码及解决办法:当某文件上的字符存入和读出时候的转码与解码操作使用不同的表与unicode对应,会产生乱码。解决方案是统一存入读出的编码表,即以什么表存,就以什么表读。

五、python2和python3的区别

  1、python2解释器默认解码表是ASCII表,而python3解释器默认的是utf-8表。

  2、目前pycharm解释器默认存入的字符用utf-8表,当然也可以调整为其他表,但是一般不需要。为了保证读出的操作也会以utf-8执行,可以在py文件的写如下内容,则表示该文件需要以此申明的表读出,称为指定文件头。因为该文件头是以纯ACSII码的对应成分组成,所以不管程序默认先以什么表读取,都可以对应,读取完后都再按照声明的表读取后续内容。

# coding:文件当初存入硬盘时所采用的编码格式

  3、python3解释器的字符串会默认存成unicode格式,所以无论如何都不会乱码,但是python2中有的字符串需要转换为unicode格式以保证不乱码,具体操作如下。

x = u'你好'  # 此行代码在python2中等同于在python3中的 x = '你好',效果是把字符转换为unicode格式

   4、结论:有选择的情况下,应该尽量选择python3,若在万不得已的情况下使用python2,字符串也一定要转为unicode格式。

猜你喜欢

转载自www.cnblogs.com/caoyu080202201/p/12482375.html