文档章节

Python 解码 Unicode 转义字符串

Konghy
 Konghy
发布于 2017/02/25 11:50
字数 1092
阅读 80
收藏 0

其实,这里要讨论的内容是针对 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 字符类型的概念,取而代之的是 strbytes 两种字符类型。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

© 著作权归作者所有

共有 人打赏支持
Konghy
粉丝 7
博文 22
码字总数 31889
作品 0
朝阳
程序员
私信 提问
编程入门13:Python文本处理

上一篇:编程入门12:Python异常处理 计算机经常需要对文本进行各种操作,我们知道Python语言表示文本的类型是字符串(str),其中可以包含任何字符。系统内部以标准的“统一码”(Unicode)...

starglow_leo
06/19
0
0
Python2.x 字符编码终极指南

在人机交互之字符编码 一文中对字符编码进行了详细的讨论,并通过一些简单的小程序验证了我们对于字符编码的认识。但仅了解这篇文章的内容,并不能帮我们在日常编程中躲过一些字符编码相关的...

selfboot
2016/12/29
0
0
Requests 库编码问题及引出的 Python 编码问题

Requests 编码 在使用 requests 访问微信接口的时候,requests 只根据 http headers 的信息来设置编码集,文档如下: 这边就是说,我们的选择还有,当服务器不指定编码集时,使用以下方式指定...

xh4n3
2015/08/12
0
0
也谈 Python 的中文编码处理

最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: Python代码 UnicodeEncodeErr...

我的去哈哈
2014/02/12
0
0
Python基础——内置hashlib、IO、Json、codecs模块(0426)

一、hashlib 加密模块:提供了很多加密的算法 常见的加密方式:MD5 RSA,加密之后不可逆。没法破解。 1、以MD5的方式加密字符串(Python 3) 示例 结果 2、以MD5的方式加密字符串(Python 2)...

python初雪之路
04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何处理JavaScript 中的货币值?

 金钱无处不在。   无论在银行应用程序、电子商务网站还是证券交易所平台,我们每天都在与金钱互动。我们也越来越依赖技术来处理问题。   然而,关于如何以编程处理货币价值尚无共识。虽...

数据星河
7分钟前
1
0
并发中的volatile

1. 概述 由于线程有本地内存的存在, 一个线程修改的共享变量不会及时的刷新到主内存中, 使得另一个线程读取共享变量时读取到的仍旧是旧值, 就导致了内存可见性问题. 现在volatile就可以解决这...

Ala6
8分钟前
2
0
三大特性之---封装

封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能...

architect刘源源
10分钟前
1
0
设计模式 之 策略模式

设计模式 之 策略模式 定义 提供几个算法策略,选择其中一个策略去执行。 优点 由于将算法封装成单独的策略,策略可以灵活切换。 扩展性好,符合开闭原则。 缺点 策略多,类也会变多 策略类需...

GMarshal
11分钟前
1
0
HBase集群监控的那些事儿

为什么需要监控? 为了保证系统的稳定性,可靠性,可运维性。 掌控集群的核心性能指标,了解集群的性能表现; 集群出现问题时及时报警,便于运维同学及时修复问题; 集群重要指标值异常时进行...

微笑向暖wx
11分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部