Python解码Unicode转义字符串
其实,这⾥要讨论的内容是针对 Python2 的,实际上也是 Python2 中让⼈头疼的编码问题,⽽ Python3 则好处理得多。
先来看看例⼦:
>>> s = "我正在学Python"
>>> s
'\xe6\x88\x91\xe6\xad\xa3\xe5\x9c\xa8\xe5\xad\xa6Python'
>>> s_u = u"我正在学Python"
>>> s_u
u'\u6211\u6b63\u5728\u5b66Python'
>>> print s
我正在学Python
>>> print s_u
我正在学Python
在 Python2 中,有两种类型的字符编码,即 str 和 unicode。⽽ str 是字节字符串,也就⼆进制数据;unicode 是⽂本字符串,是字节序列通过编码后的⽂本类型。
从上例可以看出,我们直接运⾏ s 或者 s_u 与⽤ print 打印输出是不⼀样的。直接运⾏实际上解释器是调⽤的 repr ⽅法,这样的输出表⽰是计算机可读的形式,也就在 Python 解释器内部是这么存储的;⽽⽤ print 输出的字符串则是⼈可读的,它的⽬的就是让⼈能够读懂。
那么,问题就来了,如果你得到这样的字符串:
\xe6\x88\x91\xe6\xad\xa3\xe5\x9c\xa8\xe5\xad\xa6Python
\u6211\u6b63\u5728\u5b66Python
通过⾁眼,肯定是没⼈能直接看出它们是什么东西的。再来看下⽰例:
>>> ss = "\xe6\x88\x91\xe6\xad\xa3\xe5\x9c\xa8\xe5\xad\xa6Python"
>>> ss
'\xe6\x88\x91\xe6\xad\xa3\xe5\x9c\xa8\xe5\xad\xa6Python'
>>> print ss
我正在学Python
>>> ss_u = "\u6211\u6b63\u5728\u5b66Python"
>>> ss_u
'\\u6211\\u6b63\\u5728\\u5b66Python'
>>> print ss_u
\u6211\u6b63\u5728\u5b66Python
也就是说,\x 开头的这种字符串与直接写中⽂的字符串是⼀样的,没有什么区别。因为它是⼆进制的表⽰,解释器可以直接表⽰它,输⼊中⽂的时候,解释器内部也是这么存储的。⽽ \u 开头的字符串解释器则不认识,因为这是⼀种编码,⼈们通过约定,⽤这个编码来表⽰这个汉字。
通常,我们在⽹络中接收到的字符串很多都是 \u 开头的,当我们拿到这种字符串的时候,看不出它是些什么东西,是不是很焦虑呢。实际上,这种字符串可以理解为是⼀种 escape 编码的字符串,也就是便于⽹络传输的字符串。能进⾏传输的,⼀般都是 ASCII 字符集,汉字是没法直接传输的,要传输汉字就需要把它转化成 ASCII 字符串。
要怎样才能让 \u 字符串的意思显⽽易见呢?我们先来分析⼀下,要看懂它肯定是要做⼀些编码转换的。⾸先你要清楚,你现在拿到的⽤双引号括起来的字符串⼀个 str 类型,⽽ str 类型是⼆进制的。我把这种字符串称之为转义字符串,也就是通过汉字转义后得到的字符串,这种叫法不⼀定正确,只是为了便于理解。那么,我们把它转化为⽂本字符串是不是就可以了呢。从⼆进制字符串到⽂件字符,⼀般被称之为解码,也就是 decode。这⾥,我们把它解码为 unicode-escape 编码的字符串:
decode("unicode-escape")
继续上边的例⼦:
>>> ss_uu = ss_u.decode("unicode-escape")
>>> ss_uu
u'\u6211\u6b63\u5728\u5b66Python'
>>> print ss_uu
unicode编码转换二进制我正在学Python
在 Python3 中,则不再会出现这样的问题。Python3 中不再有 str 和 unicode 字符类型的概念,取⽽代之的是 str 和 bytes 两种字符类型。str 是编码过的 unicode ⽂本字符,bytes 是编码前的字节序列。Python3 在编码的处理上要简单得多,它不再有所谓 unicode 字符串的概念,虽然也兼容 u"" 这样的写法,但这实际上也是⼀个 str 类型。如⽰例:
>>> s = "我正在学Python"
>>> s
'我正在学Python'
>>> print(s)
我正在学Python
>>> s_u = u"我正在学Python"
>>> s_u
'我正在学Python'
>>> print(s_u)
我正在学Python
>>> type(s)
<class 'str'>
>>> type(s_u)
<class 'str'>
>>> ss_u = "\u6211\u6b63\u5728\u5b66Python" >>> ss_u
'我正在学Python'
>>> print(ss_u)
我正在学Python
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论