设为首页 收藏本站
查看: 1042|回复: 0

[经验分享] [转]理解python中的bytestring和unicode

[复制链接]

尚未签到

发表于 2017-4-27 09:16:02 | 显示全部楼层 |阅读模式
编码的概念

首先让我们来了解一些有关编码的背景知识。在计算机世界中的,一个字节(byte)通常有8位(bit),能表示256个字符(character)。不过当今世界不同的语言中包含的文字成千上万,一个字节所能表示的字符个数远远不能满足实际的需要,所以我们要用更多的字节来表示更多的字符。用字节来表示字符的过程称之为编码。ASCII编码共有127字符,所以每个字符可以用一个字节表示。覆盖众多西欧语言的ISO-8859(Latin)系列编码是 ASCII编码的超集,每个字符也使用一个字节来表示,最多可以表示256个字符。在我们的国标码GB2312中,每个字符用两个字节表示。 Windows NT的内部使用UCS-2编码,也是双字节编码。Linux平台上流行的UTF-8编码是可变长编码,单字节兼容ASCII编码,双字节覆盖西欧语言,三字节用来编码中、日、韩(CJK)文字。
请看下面的图示,横列是字符串,竖列是相应编码后的字节序列,竖列框中用十六进制表示字节的值:
 

            +-+-+-+-+-+-+            +--+--+            +--+--+
ASCII    |p|y|t|h|o|n|   GB2312   |巨|蟒|    UTF-8   |巨|蟒|
+-+-+-+-+-+-+            +--+--+            +--|--+
| | | | | | |            |  |  |            |  |  |
+----+<---+ | | | | | |   +----+<--+  |  |   +----+<--+  |  |
|0x70|      | | | | | |   |0xbe|      |  |   |0xe5|      |  |
+----+<-----+ | | | | |   +----+      |  |   +----+      |  |
|0x79|        | | | | |   |0xde|      |  |   |0xb7|      |  |
+----+<-------+ | | | |   +----+<-----+  |   +----+      |  |
|0x74|          | | | |   |0xf2|         |   |0xa8|      |  |
+----+<---------+ | | |   +----+         |   +----+<-----+  |
|0x68|            | | |   |0xfe|         |   |0xe8|         |
+----+<-----------+ | |   +----+<--------+   +----+         |
|ox6f|              | |                      |0x9f|         |
+----+<-------------+ |                      +----+         |
|0x6e|                |                      |0x92|         |
+----+<---------------+                      +----+<--------+
编码方面就简单介绍到这了,下面进入python部分。
 

python中的bytestring

在python的交互模式下尝试输入下面的语句:
 

>>> '\x41'
'A'
>>> '\172'
'z'
如上所示,在python字符串(这里的字符串都指单个引号包围的字符串)中,可以使用'\'来进行转义。'\x41'使用两位十六进制数来表示一个字节的值,在ASCII中代表'A'。'\172'使用三位八进制数来表示一个字节的值,在ASCII中代表'z'。
让我们来输入一些中文(windows下):
 

>>> bytestr = 'python巨蟒'
>>> bytestr
'python\xbe\xde\xf2\xfe'
>>> len(bytestr)
10
中文环境下,cmd的代码页是cp936(即是GBK编码,GB2312的扩展编码),每个汉字占两个字节。因此'python巨蟒'共10个字节,可以看出python中的字符串其实是字节串(byte string)。
 

python中的unicode

python 中除了byte string,还有unicode string。因为unicode大到足以容纳我们用到的所有字符,所以可以把unicode看成对字符的一种抽象表示。使用unicode的明显好处是可以处理更大的字符集,所以常常要把byte string转换成unicode string,这个过程称为解码。
现在让我们来对byte string进行解码,将其转换成unicode string
 

>>> bytestr = 'python巨蟒'
>>> unicodestr = bytestr.decode('cp936')
>>> unicodestr
u'python\u5de8\u87d2'
>>> len(unicodestr)
8
可以看到unicodestr的长度是8,和'python巨蟒'的字符个数一样。
也可以照下面这样做:
 

>>> bytestr = 'python巨蟒'
>>> unicodestr = unicode(bytestr, 'cp936')
之后,可以对unicode string进行不同格式的编码,转化为相应的byte string
 

>>> unicodestr.encode('cp936')
'python\xbe\xde\xf2\xfe'
>>> unicodestr.encode('utf-8')
'python\xe5\xb7\xa8\xe8\x9f\x92'
因为cmd的代码页是cp936,所以把unicodestr按utf-8编码后,会打印出的乱码字符
 

>>> utf8bytestr = unicodestr.encode('utf-8')
>>> utf8bytestr
'python\xe5\xb7\xa8\xe8\x9f\x92'
>>> print utf8bytestr
python宸ㄨ煉
 

python脚本中的编码指定

如果是在python的脚本文件中,可以在首行或者紧跟着#!行注明编码
 

# -*- encoding: utf-8 -*-
下面是一段脚本

# -*- encoding: utf-8 -*-
unicodestr = unicode('python巨蟒', 'utf-8')
print unicodestr
unicodestr = unicode('python巨蟒', 'cp936')
print unicodestr
unicodestr = u'python巨蟒'
print unicodestr
输出结果如下

python巨蟒
python宸ㄨ煉
python巨蟒
 

一个小问题

可以看到,u'python巨蟒'中的字符串被自动解码,转化为unicode,这是python中另一种定义unicode字符串的方式。不过这种方式在GUI shell下会有一些问题。比如在IDLE中输入u'巨蟒'结果如下:
 

>>> u'巨蟒'
u'\xbe\xde\xf2\xfe'
而在python的交互模式下就不会有问题:
 

>>> u'巨蟒'
u'\u5de8\u87d2'
GUI shell其实是使用code标准模块来进行read-eval-print loop的。
另外通过调用命令行"python -c command"来执行代码结果也是如此。在cmd中输入

python -c "for x in u'巨蟒': print hex(ord(x))"
结果是:
 

0xbe
0xde
0xf2
0xfe

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369762-1-1.html 上篇帖子: 服务器暂时无法响应您的请求 500 Internal Server Error 下篇帖子: python编译py成pyc和pyo
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表