天下网吧 >> 网吧系统 >> 系统动态 >> 正文

科普:Python编码的前世今生

2016-12-8不详佚名
e只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的Unicode编码是 6C49,我可以用4个 ASCII 数字来传输、保存这个编码;也可以用UTF-8编码的3个连续的字节 E6 B1 89来表示它。关键在于通信双方都要认可。因此Unicode编码有不同的实现方式,比如:UTF-8、UTF-16等等。这里的Unicode就像英语一样,做为国与国之间交流世界通用的标准,每个国家有自己的语言,他们把标准的英文文档翻译成自己国家的文字,这是实现方式,就像UTF-8。

UTF-8

UTF-8(Unicode Transformation Format)作为Unicode的一种实现方式,广泛应用于互联网,它是一种变长的字符编码,可以根据具体情况用1-4个字节来表示一个字符。比如英文字符这些原本就可以用ASCII码表示的字符用UTF-8表示时就只需要一个字节的空间,和ASCII是一样的。对于多字节(n个字节)的字符,第一个字节的前n为都设为1,第n+1位设为0,后面字节的前两位都设为10。剩下的二进制位全部用该字符的UNICODE码填充。

科普:Python编码的前世今生

以汉字“好”为例,“好”对应的Unicode是 597D,对应的区间是 0000 0800--0000 FFFF,因此它用UTF-8表示时需要用3个字节来存储,597D 用二进制表示是: 0101100101111101,填充到 1110xxxx 10xxxxxx 10xxxxxx 得到11100101 10100101 10111101,转换成16进制:E5A5BD,因此“好”的Unicode“597D”对应的UTF-8编码是“E5A5BD”。

中文        好    unicode         0101   100101   111101    编码规则     1110xxxx 10xxxxxx 10xxxxxx                --------------------------    utf-8       11100101 10100101 10111101                --------------------------    16进制utf-8     e   5    a   5    b   d

Python字符编码

注:以下代码和概念都是基于Python 2.x。

现在总算把理论说完了。再来说说Python中的编码问题。Python的诞生时间比Unicode要早很多,Python的默认编码是ASCII。

>>> import sys

>>> sys.getdefaultencoding()

'ascii'

所以在Python源代码文件中如果不显式地指定编码的话,将出现语法错误

#test.py

print "你好"

上面是test.py脚本,运行 python test.py 就会包如下错误:

File “test.py”, line 1 yntaxError: Non-ASCII character ‘\xe4′ in file test.py on line 1, but 

no encoding declared; see http://www.python.org/ ps/pep-0263.html for details

为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式:

# coding=utf-8

或者是:

#!/usr/bin/python

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

在Python中和字符串相关的数据类型,分别是 str、unicode 两种,他们都是 basestring 的子类,可见str与unicode是两种不同类型的字符串对象。

basestring

     /  \   

    /    \  

str     unicode

对于同一个汉字“好”,用str表示时,它对应的就是UTF-8编码'\xe5\xa5\xbd',而用 Unicode表示时,它对应的符号就是 u'\u597d',与u"好"是等同的。需要补充一点的是,str类型的字符其具体的编码格式是UTF-8还是GBK,还是其它格式,根据操作系统相关。比如在Windows系统中,cmd命令行中显示的:

# windows终端

>>>&nb

本文来源:不详 作者:佚名

相关文章
没有相关文章
声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系Email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下