Python 解码 Unicode 转义字符串
2017-02-25 00:00
267 查看
摘要: Python 的 unicode 转义字符串可以通过解码为 escape 编码类型来查看其要表示的类型。在 Python2 中,有两种类型的字符编码,即 str 和 unicode。而 str 是字节字符串,也就二进制数据;unicode 是文本字符串,是字节序列通过编码后的文本类型。
其实,这里要讨论的内容是针对 Python2 的,实际上也是 Python2 中让人头疼的编码问题,而 Python3 则好处理得多。
先来看看例子:
在 Python2 中,有两种类型的字符编码,即 str 和 unicode。而 str 是字节字符串,也就二进制数据;unicode 是文本字符串,是字节序列通过编码后的文本类型。
从上例可以看出,我们直接运行 s 或者 s_u 与用 print 打印输出是不一样的。直接运行实际上解释器是调用的
那么,问题就来了,如果你得到这样的字符串:
通过肉眼,肯定是没人能直接看出它们是什么东西的。再来看下示例:
也就是说,
通常,我们在网络中接收到的字符串很多都是
要怎样才能让
继续上边的例子:
在 Python3 中,则不再会出现这样的问题。Python3 中不再有 str 和 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
我正在学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
相关文章推荐
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode 分类: python
- Robot Framework RIDE中的字符转换、中文、python的gbk解码 unicode('${org_name}',"utf-8")
- python unicode 及解码编码方式简介
- Python 解码 Unicode 转义字符串 (转)
- python编码解码unicode
- python 解码 unicode 明文
- python 解码Unicode
- python字符编码与解码 unicode,str
- 【小小伎俩】消杀Python解码时的UnicodeEncodeError
- python 解码 unicode 明文
- Python 中的编码转换 编码方案 中文解码 gbk , utf ,unicode
- python笔记6-%u60A0和\u60a0类似unicode解码
- unicode 和 str(Python字符编码解码)
- Python 有关unicode,gbk,cp2312,utf8的解码和编码
- Python编解码小结(一)—— Unicode的来龙去脉
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode
- python2.7 中unicode、str的编解码关系
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode
- python2.7 中unicode、str的编解码关系
- python 解码 unicode 明文