字符编码之实践篇

Windows字符终端(cmd)内部已支持Unicode,另外终端还可以显性地支持设置另外一种编码,中文操作系统中默认为GBK,可以通过chcp命令修改,也可以修改注册表设置默认编码。

两种修改方法:

  1. chcp 65001:设置终端编码为utf-8(如果只输入chcp则显示当前编码)。chcp命令即是change code page的缩写。
  2. 修改注册表:[HKEY_CURRENT_USER\Console],修改CodePage的键值,输入对应编码的十进制数即可.

列集中常见codepage 和国家对应关系:

codepage 国家(地区)或语言
437 美国-ASCII
936 中国-GBK
950 繁体中文
65001 Unicode-UTF-8

 

   

 

 

 

python3解释器默认将字符串(将代码文件看成字符串)转换成Unicode加载到内存并展示代码输出结果,因此Windows终端默认就是可以显示中文的。

python2解释器使用的编码则是使用了代码文件中声明的编码相同的编码将代码文件加载到内存和输出,所以要避免显示乱码,需要代码中声明的编码与字符终端的编码一致

python2的类型有str、unicode、bytes类型,str等同于bytes类型(主要用于支持图片、影音文件等非字符类的二进制格式文件而增加的一种类型),str是显示字符,bytes显示二进制,当为字符时,print会根据unicode编码表找到对应二进制对应的字符显示。

python3只有str、bytes(不再有unicode类型,默认加载到内存都转成unicode),版本3里这两种类型有明显加以区分,str就是unicode格式字符,用于存储与传输时都是bytes。字符串为字符时,print不再根据编码表查找对应字符加以显示,而是仍旧是输出二进制(十六进制表示)

========万国码Unicode与各个国家编码之间的对应关系

以GBK中的汉字“中国”为例:

Unicode输出十六进制:u'\u4e2d\u56fd',u表示Unicode,每个汉字两个字节表示。4e2d在Unicode表中查询到汉字正是“中”,而对应的GBK编号为:G0-5650。然而这个数字跟实际GBK的编码(\xd6\xd0)是对不上,那么它们之间的对应关系是什么呢?

分析一下d6d0,也是一个十六进制数,两个字节共16位,根据8421码规则将其分成4个4位二进制的组,将第二组和第四组二进制数(这里对应都是十六进制d)的高位去掉[也可以看成是将两个字节中的二进制最高位置零],也就是减掉8,得出的结果恰好就是5650。

结论:

  将Unicode的编码表中对应的GBK编码的第二位和第四位数字加上8之后就是对应的GBK编码

 

posted @ 2018-05-25 01:53  念宗  阅读(131)  评论(0编辑  收藏  举报