其实,这里要讨论的内容是针对 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 转义字符串 (转)的更多相关文章

  1. Python中Unicode字符串

    Python中Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte ...

  2. 【转】python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode

    原文网址:http://blog.csdn.net/trochiluses/article/details/16825269 摘要:在进行python脚本的编写时,如果我们用python来处理网页数据 ...

  3. python字符编码与解码 unicode,str

    解释以下几个问题: (1)python2中str和unicode是两种字符串类型,与字符编码方式是什么关系? (2)str和unicode是怎么相互转换的? (3)'\x...':'\u...', ' ...

  4. python转换已转义的字符串

    python转换已转义的字符串 有时我们可能会获取得以下这样的字符串: >>> a = '{\\"name\\":\\"michael\\"} ...

  5. Python 学习笔记:Python 中单引号(')、双引号(")、三引号(''',""")的使用以及不转义字符串

    一.单引号.双引号及三引号: 参考博客:https://www.cnblogs.com/chenhuan001/p/8006017.html 以上四种形式都是 Python 表示字符串的方式,具体的效 ...

  6. Python教程(2.4)——字符串

    2.2节讲过,Python中有字符串类型.在Python中,字符串用'或"括起,例如'abc'."qwerty"等都是字符串.注意'和"并不是字符串的内容. A ...

  7. python学习第九讲,python中的数据类型,字符串的使用与介绍

    目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...

  8. Python基础:数据类型-字符串(7)

    1.字符串基本操作 字符串是由字符组成的一串字符序列,字符串是有顺序的,从左到右,索引从0开始,依次递增. Python中字符串类型:str. Python中字符串的三种表示方式: (1)普通字符串: ...

  9. 『Python基础-4』字符串

    # 『Python基础-4』字符串 目录 1.什么是字符串 2.修改字符串 2.1 修改字符串大小 2.2 合并(拼接)字符串 2.3 使用乘号'*'来实现字符串的叠加效果. 2.4 在字符串中添加空 ...

随机推荐

  1. Error converting bytecode to dex: Cause: java.lang.RuntimeException: Exception parsing classes

    http://blog.csdn.net/xx326664162/article/details/51859106 总算有个靠谱的了

  2. codeforces 869A The Artful Expedient【暴力枚举/亦或性质】

    A. time limit per test 1 second memory limit per test 256 megabytes input standard input output stan ...

  3. Apache Kafka 企业级消息队列

    1.大纲 了解 Apache Kafka是什么 掌握Apache Kafka的基本架构 搭建Kafka集群 掌握操作集群的两种方式 了解Apache Kafka高级部分的内容 2.消息系统的作用是什么 ...

  4. 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

    layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...

  5. [BZOJ 2817] 波浪

    Link: BZOJ 2817 传送门 Solution: 算是比较神的DP了吧, 首先这个绝对值处理起来很难受,肯定要想办法去掉 于是想到从小到大插入的方式,便不存在绝对值的问题了 插入一个数只有5 ...

  6. [BZOJ 2743] 采花

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2743 Algorithm: 此题询问区间内出现次数超过1个的数字 明显在线做无从下手,无 ...

  7. 【动态规划】Codeforces Round #392 (Div. 2) D. Ability To Convert

    D. Ability To Convert time limit per test 1 second memory limit per test 256 megabytes input standar ...

  8. laravel中的事件处理

    一.什么是事件处理 事件就是在特地时间.特定地点.发生的特定行为.例如:删除某个用户帖子这个行为后,要通过站短发送信息给帖子所属的用户.这里就有删除帖子事件,发站短是事件后处理. 二.为什么要使用事件 ...

  9. JavaEE学习路线图

    http://www.cnblogs.com/gaoming7122/archive/2012/11/20/2778308.html

  10. 64位下安装Scrapy 报错 "could not find openssl.exe" 的解决方法。

    其实就是安装对应的64位 pyOpenSSL 就行了, 下载地址如下: https://tahoe-lafs.org/source/tahoe-lafs/deps/tahoe-lafs-dep-egg ...