初学Python:encode、decode和Unicode等

本人是Python的初学者,阐述不到位或者不对之处,敬请见谅!
首先搞清楚:字符串在Python内部的表示是unicode编码,我一般在Python代码开始,加上:

reload(sys)
sys.setdefaultencoding('utf-8') #修改系统的默认编码

这样,代码默认的编码格式就是utf-8,另外,了解一下:

print sys.getdefaultencoding() #获取系统默认的编码

encode()和decode()都是字符串的函数
encode:编码,将unicode编码转换成其他编码的字符串
decode:解码,将其他编码的字符串转换成unicode编码
Unicode类型:编码的基础类型(有些说法是一个类)

在做编码转换时,通常需要以unicode作为中间编码,
即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码

      decode                 encode
str ---------> str(Unicode) ---------> str

如:s=‘中文’
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件

u = ‘zb’ #指定一个字符串u

str1 = u.encode(‘gb2312’) #str1表示u的gb2312编码结果,获得bytes类型对象
str2 = u.encode('gbk') #str2表示u的gbk编码结果,获得bytes类型对象
str3 = u.encode('utf-8') #str3表示u的utf8编码结果,获得bytes类型对象

>>> u1 = str1.decode('gb2312') # 对gb2312编码的str1进行解码,获得字符串类型对象
>>> print('u1')
'中文'
>>> u2 = str1.decode('utf-8')  # 报错,因为str1是gb2312编码的

备注:似乎还有这种写法:
unicode(str,“utf8”) #从utf8编码(当然也可以是别的编码)的字符串str生成 unicode类的对象

简要说下一般有哪些编码格式(来源于网络)

ASCII码

ASCII码是美国早期制定的编码规范,只能表示128个字符,包括英文字符、阿拉伯数字、西文字符以及32个控制字符。简单来说,就是下面这个表:
在这里插入图片描述

扩展ASCII码(Extended ASCII)

扩展ASCII码的出现是因为ASCII不够用,所以向ASCII表继续扩充到256个符号。
但是因为对于扩展ASCII,不同的国家有不同的标准,于是促使了Unicode编码的诞生。
扩展ASCII码表如下:
在这里插入图片描述

Unicode

准确来说,Unicode不是编码格式,而是字符集。这个字符集包含了世界上目前所有的符号。
另外,在原来有些字符可以用一个字节即8位来表示的,在Unicode将所有字符的长度全部统一为16位,因此字符是定长的。

GB2312

当国人得到计算机后,那就要对汉字进行编码。在ASCII码表的基础上,小于127的字符意义与原来相同;而将两个大于127的字节连在一起,来表示汉字,前一个字节从0xA1(161)到0xF7(247)共87个字节,称为高字节,后一个字节从0xA1(161)到0xFE(254)共94个字节,称为低字节,两者可组合出约8000种组合,用来表示6763个简体汉字、数学符号、罗马字母、日文字等。
在重新编码的数字、标点、字母是两字节长的编码,这些称为“全角”字符;而原来在ASCII码表的127以下的称为“半角”字符。
简单而言,GB2312就是在ASCII基础上的简体汉字扩展。

gb2312码表:
http://www.fileformat.info/info/charset/GB2312/list.htm

GBK

简单而言,GBK是对GB2312的进一步扩展(K是汉语拼音kuo zhan(扩展)中“扩”字的声母),
收录了21886个汉字和符号,完全兼容GB2312。

GB18030

GB18030收录了70244个汉字和字符,更加全面,与 GB 2312-1980 和 GBK 兼容。
GB18030支持少数民族的汉字,也包含了繁体汉字和日韩汉字。
其编码是单、双、四字节变长编码的。

UTF(UCS Transfer Format)

UTF是在互联网上使用最广的一种Unicode的实现方式。我们最常用的是UTF-8,表示每次8个位传输数据,除此之外还有UTF-16

简单总结(来源于网络)

  1. 中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字
  2. 汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多
  3. 中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码
  4. 每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容
  5. 终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释
  6. UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以
发布了37 篇原创文章 · 获赞 2 · 访问量 7632

猜你喜欢

转载自blog.csdn.net/bingozb/article/details/98469441