Python字符编码

对于大多数的程序员来说字符编码问题是一个很头疼的问题,不论是刚参加工作的程序员还是有经验的程序员,在这里将介绍一下Python中的字符编码问题。

在介绍编码问题之前首先的介绍编码的演变这样更有利于我们正确的认知编码。

二进制,最开始的时候机器只能认识二进制文件而我们在编写程序时也是使用二进制但是这样太不方便了,便引入了ASCII

--ASCII:(American Standard Code for Information Interchange,美国信息交换标准代码)只能存英文和拉丁字符,一个字符占一个字节,8位

--gb2312:只能存6700多个中文,,1980

--gbk1.0:存2万多字符,1995

--gb18030:2000,27000中文

中国的字符编码的演变方式,现在中国的软件应用在发布时都要求支持gb18030,而其它国家也相应发展着各自的字符编码。因此便会发生各种各样的让程序员们头疼的乱码事情。为了应对这个问题制定了Unicode他的伟大在于可以兼容各国的字符编码。

Unicode可以把它认为是一个标准它还有以下几种形式,其中最常用的是utf-8:可变长的字符编码。

----unicode:utf-32:一个字符占4个字节

----unicode:utf-16(默认):一个字符占2个字节或2个以上,65535

----unicode:utf-8:一个英文用ASCII码来存,一个中文占3个字节

之前由于每个国家的字符编码不同所以再相互识别时会产生乱码,加上没有可以兼容所以国家的字符编码。在那时假如英雄联盟火了之后只能在美国玩,那么要想在中国玩就必须需要给这个游戏打一个中文的补丁包才可以玩(其他操作应该都是正常的,但是字符的显示会影响游戏体验),如果是在其他国家就得相应的添加其他国家的语言包,这样来说对于开发游戏的成本就会加大,所以有了Unicode后,如果英雄联盟在创作时只要支持Unicode就可以了,当美国玩家使用时,Unicode可以支持美国的字符编码;中国玩家使用时,Unicode也可以支持中国的字符编码。所以它必然是未来的趋势。

理解字符编码中的编码和解码

对于上面的例子当这款游戏字符编码时首先从美国编码-->(解码)Unicode;Unicode-->(编码)中文编码

注:编码encode 解码decode

通过Unicode作为中介人(或者说是一个翻译官)进行翻译。Unicode收录了所有国家的编码方式,所以可以解释每个国家字符编码。

Python2和Python3有很大的不同,其中在字符编码上也是如此,下面围绕这个方向介绍。

字符输入端和输出端的概念

在字符编码中还有一个特别容易忽视的问题就是输入的文本编辑器和输出的显示端,如果输入的是utf-8;输出的是gbk则会出现对应的乱码问题。必须要保持两端的字符编码相同。

在Python2版本中默认编码是ASCII

#_*_ coding:utf-8 _*_

上一句是在Python2中设置文本的编码方式(默认是ASCII)

美国编码-->(解码)Unicode;Unicode-->(编码)中文编码

现在还是从这个过程说起,在Python2解码时必须要指定解码方式如果不指定会使用Python2默认的ASCII,会报错;要指定输入端的文本编辑器的编码方式。在解码为Unicode的时,在相应的编码为gbk或Unicode:utf-8,因为Unicode中默认的不是utf-8所以需要编码,如果输出端是gbk的则编码为gbk即可。否则可能会出现乱码,这里的可能是因为unicode向下兼容,支持多国编码.

现在还是从这个过程说起,在解码时必须要指定解码方式如果不指定会使用Python2默认的ASCII,会报错;要指定输入端的文本编辑器的编码方式。在解码为Unicode的时,在相应的编码为gbk或Unicode:utf-8,因为Unicode中默认的不是utf-8所以需要编码,如果输出端是gbk的则编码为gbk即可。否则可能会出现乱码,这里的可能是因为unicode向下兼容,支持多国编码

Python3版本默认是unicode

所有在Python3中输入时不必再向Python2中那样的加入#_*_ coding:utf-8 _*_(这里的编码可以写为其他的编码方式)因为文件的默认是utf-8;在需要注意的是encode在编码的同时会把中文字符转为bytes类型,在ASCII中能找到则转化为ASCII,decode在解码的时做相应的逆操作。也就是说在Python3中更好的处理了字符编码问题,但是还是请认真理解这个字符编码的过程。

unicode:编码的是以u开头

bytes:b开头是[0-255]的纯数字的字符类型;这种数据类型主要是用于文件的传送

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180116A0VVLL00?refer=cp_1026

扫码关注云+社区