本文作者:念宗

字符编码之实践篇

念宗 6年前 ( 2018-11-18 ) 3696 抢沙发
摘要: Windows字符终端(cmd)内部已支持Unicode,另外终端还可以显性地支持设置另外一种编码,中文操作系统中默认为GBK,可以通过chcp命令修改,也可以修改注册表设置默认编...

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繁体中文
65001Unicode-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编码

 


文章版权及转载声明:

作者:念宗本文地址:http://pyops.net/?id=3发布于 6年前 ( 2018-11-18 )
文章转载或复制请以超链接形式并注明出处运维之道

分享到: 网站分享代码

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

发表评论

快捷回复:

验证码

评论列表 (暂无评论,3696人围观)参与讨论

还没有评论,来说两句吧...