python2编码_Python2字符编码

webchat.jpg

我们通常见到的字符串编码主要是三种GB2312/GBK、Unicode、UTF-8。GB2312/GBK是多字节(multibytes)编码的一种,属于“ASCII的加强版”,与之平行的由Big5、ShiftJIS之类的编码各自为政,所有这些用两个字节表示汉字的多字节编码标准统称为ANSI编码,同样的汉字在不同的ASNI编码中的表示是不同的。为了避免这个问题,Unicode应运而生,将全世界所有的字符统一编码到一个定长的结构中。Unicode解决了统一编码的问题,但带来了新的问题。第一点,Unicode和ASCII不兼容了,这是因为ASCII只有一个字节,而这一个字节肯定装不下Unicode。第二点,用Unicode传输开销变大了,这是因为很多文档二十六个字母(1个字节)就能解决了,用Unicode多了很多冗余的字节。因此UTF-8应运而生。UTF-8对Unicode进行变长编码(我们可以想象下Huffman树),通常长度在1-4字节。目前Linux系统使用的是UTF-8编码,而Windows内部则是UTF-16LE/GBK编码。

Python2的字符串表示

Python2中有表示字符串有str和Unicode两种。其中一个str字面量由""表示,我们也可以用''或者"""这类括号括起,一个Unicode字面量由u""括起。1

2

3

4

5

6

7

8"你好"

'xc4xe3xbaxc3'

u"你好"

u'u4f60u597d'

type("你好")

type(u"你好")

其中Unicode得益于ucs2/ucs4标准,在不同系统上都是固定的表示的。其中ucs2即Unicode16,比较常见,用2个字节(65536)来索引,一般表示是u"uxxxx",ucs4即Unicode32,一般表示是u"Uxxxxyyyy"在一些Python中也能见到。我们可以通过下面的代码来检测Python是哪一个1

2

3

4

5

6

7

8

9--enable-unicode=ucs4

>>> import sys

>>> print sys.maxunicode

1114111

--enable-unicode=ucs2

>>> import sys

>>> print sys.maxunicode

65535

str的表示取决于所在的系统,例如Linux是默认UTF8,上面的“你好”就会变为'/xe4/xbd/xa0/xe5/xa5/xbd',我们这里看到UTF8确实是一种字符的表示。1

2

3

4

5

6

7

8

9

10

11>>> "hello".encode("utf-8")

'hello'

>>> "hello".decode("gbk").encode("utf-8")

'hello'

>>> "你好".encode("utf-8")

Traceback (most recent call last):

File "", line 1, in

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

>>> "你好".decode("gbk").encode("utf-8")

'xe4xbdxa0xe5xa5xbd'

Python2中字符串问题实录

reload

在Python2中出现编码问题时,很多人喜欢使用下面的语句来改变系统的默认编码1

2

3import sys

(sys)

sys.setdefaultencoding('utf-8')

这种策略通常用来解决下面这样的错误提示

UnicodeEncodeError: 'ascii' codec can't encode byte

现在ASCII码不能encode是吧,那我默认都用utf-8来encode总行了吧?但这样可能存在问题,博文中就举出了一个实例。对于多字节字符串str,我们之前默认用ASCII解码,要是解不开,就RE了。现在我们默认用utf-8解,utf-8阈值广,基本都能解开,不RE了,可是就不WA了么?样例中举出一个例子,一个latin-1编码的字符串,用utf-8解码不会报错,但解出来的结果并不对。因此在多字节编码规则不统一这个客观问题存在的情况下,不存在银弹。我们需要的是用chardet.detect来猜测编码。当猜测不出时我们只能不停地try,直到找到一个解码不报错的编码,虽然可能解出来还是乱码,因为可能一段byte串同时用utf-8、gbk、Big5等都能解码而不报错。

这里提供一个工具类,能够尽可能地猜测字节串所使用的编码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23def ultimate_decode(doc):

def try_decode(s, try_decoding):

try:

res = s.decode(try_decoding)

return True, res

except UnicodeDecodeError:

return False, ""

if isinstance(doc, str):

predicted = chardet.detect(doc)

print predicted

if predicted['encoding'] and predicted['confidence'] > 0.5:

doc = doc.decode(predicted['encoding'])

else:

encodeing_list = ["utf-8", "gbk", "Big5", "EUC-JP"]

for e in encodeing_list:

state, res = try_decode(doc, e)

if state:

doc = res

break

if not isinstance(doc, unicode):

return None

return doc

coding

当我们在Python代码文件中需要加入中文时,我们需要在文件开头加上这两行中的一行,不然即使用上前面的reload大法都不行。1

2#-*- coding:utf-8 -*-

#coding: utf8

这是用来指定Python代码文件所使用的编码方式。在Python2.1时,这个机制还没有引入,我们只能通过unicode-escape的方式输入。一个类似的做法是很多json库dump的结果中常出现u打头的unicode-escape字符串,这是非常正常的现象。这样json库可以省事地避免编码问题,因为这样json文件现在都是ASCII码了。

伪装成Unicode的多字节

有时候我们会看到这种东西u'xe3x80x8axe5',首先这外面套了个u,应该是Unicode,但是里面却是x打头的multi-bytes的形式,这往往是由于错误调用unicode()函数所致的。对此,python提供了raw_unicode_escape来解决这个问题

正则匹配

由于存在特殊符号的原因,使用正则匹配时宜使用Unicode而不是多字节匹配。但是以下的编码在Win10和某些Linux发行版上都跑不了,但在MacOS和Ubuntu上能够正常运行,去StackOverflow问了,他们认为这是一个Bug,所以暂时还是先用上面的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

angularJs关于指令的一些冷门属性

我们使用ng的时候,经常会使用到指令,大家所熟知的属性我在这里就不介绍了,讲讲大家没怎么留意的属性 1.multiElement 这是指定指令作用区间的功能,最常用的就是ng-repeat-start和ng-repeat-end了。 2.priority 指令优先级&#xf…

设备模型2

前言 在上一篇中,我们大致描述了LINUX设备模型,我们先来总结一下三要素的关系。 从图中可以看出,Linux设备模型就是"总线、设备、驱动、类"这四个概念之前的相互关系;这也是Linux2.6内核抽象出来的用于管理系统中所有设备的模型图; 简单地描述…

angular自定义指令详解

指令(directive)是angular里面最核心也是最难懂的东西,在慕课网看了下大漠穷秋老湿的视频,自己百度半天做了一些小test,总算把一切都搞明白了。 先列出学习来源: 指令中controller和link的区别:…

delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨

多次被问到这样的问题:java服务端的rsa加密操作已经完成,返回一个16进制的字符串给python平台,但是在python进行私钥解密的时候发现行不通。。。。前端python加密,后端用java解密,解不出来还有诸如nodejs从理论上来说&…

类的定义、成员定义修饰符

类的定义 修饰符含义1无或internal 只能在当前项目中访问类,其它项目引用后也无法访问2public 可以任何地方访问类3abstract 不能实例化,只能供继承之用4sealed 不能供派生之用,只能实例化5internal abstract136public abstract237intern…

设备模型3

在上一篇分析中,多次提到了SYSFS,这是个什么东西?这可是个很大的TOPIC,关于它的讲述可以写本书,但是我们暂时的目标不是要完全啃投它所有的东西,没时间,没精力,我们只要掌握我们需要…

浪潮之巅读后感

这几天看到一本非常好的书《浪潮之巅》。浪潮,指的是时代的大潮。而浪潮之巅,顾名思义就是指站在时代潮流的巅峰,引领时代潮流,扛起发展大旗。而本书就是在介绍各大处在浪潮之巅的IT公司的历史及发展。 书中有句话说得好&#xff…

利用dft的定义计算dft的matlab程序_CP2K教程系列之静态计算(Pymatflow篇)

本系列CP2K教程是《CP2K菜根谭》的升级版,在旧版基础上添加了如何结合Pymatflow工具简化计算流程的内容。话不多说,本文将为您带来CP2K系列教程中的静态计算部分。静态计算设置静态计算是大多数人接触第一性原理计算后第一次运行的计算类型。很多其它类型…

机器学习:最大似然估计与最大后验概率估计

在机器学习领域,概率估计是经常用到的一种模型,而概率估计中,我们经常会看到两种估计模型,一种是最大似然估计,即 Maximum likelihood, 另外一种就是最大后验概率估计,即 Maximum posterior &am…

ubuntu14.04安装git

参考教程:git介绍:安装,使用,创建分支 安装的方法有两种,一种直接是通过ubuntu的APT安装,这种方法最简便,缺点是版本可能不是最新的。所有还有另一种方法是下载源码进行安装,这种能…

微软是如何戏耍程序员们的

2019独角兽企业重金招聘Python工程师标准>>> 别用微软的东西。商业目的性太强,千万别被微软牵着鼻子走,血淋淋的教训。微软推出的垃圾多了去了。它什么都想做,很多都没做好: MFC:Win31时代出生,…

3d立体相册特效html网页代码_新闻类网页正文通用抽取器

项目起源开发这个项目,源自于我在知网发现了一篇关于自动化抽取新闻类网站正文的算法论文——《基于文本及符号密度的网页正文提取方法》这篇论文中描述的算法看起来简洁清晰,并且符合逻辑。但由于论文中只讲了算法原理,并没有具体的语言实现…

ubuntu14.04安装 R16 Tina Linux SDK

第一步:由于是14.04系统所以这样$sudo -i $cd /etc/apt/sources.list.d $echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" > ia32-libs-raring.list $apt-get update $apt-get install ia32-libs $r…

分答

用户在分答上可以自我介绍或描述擅长的领域,设置付费问答的价格,其他用户感兴趣就可以付费向其提问。分答的收入分配机制增加了信息的价值,分答中信息接收者被区分成了两种身份。首先提问的人是一种付费悬赏模式,当回答完毕内容沉…

字节数组转换为图片_每日一课 | Python 3 TypeError:无法将“字节”对象隐式转换为str...

将Python 2套接字示例转换为Python 3whois.py import sysimport sockets socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(("whois.arin.net", 43))s.send((sys.argv[1] "\r\n").encode())response ""while True: data s.re…

php版redis插件,SSDB数据库,增强型的Redis管理api实例

php版redis插件,SSDB数据库,增强型的Redis管理api实例 SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储。另外,rocksdb是FB在LevelDB的二次开发版本,因此也存…

加速度计和陀螺仪数据融合

本帖翻译自 IMU(加速度计和陀螺仪设备)在嵌入式应用中使用的指南。这篇文章主要介绍加速度计和陀螺仪的数学模型和基本算法,以及如何融合这两者,侧重算法、思想的讨论介绍本指南旨在向兴趣者介绍惯性MEMS(微机电系统&a…

循环嵌套练习题

//BOSS://让用户输入一个奇数,打印菱形,最长的行内容个数为用户输入的个数,并且由英文字母拼接而成//比如用户输入了7// A// ABA// ABCBA// ABCDCBA// ABCBA// ABA// A//1、接收并判断用户输入的是不是数字 try{#region 解法一…

python leetcode_leetcode 介绍和 python 数据结构与算法学习资料

for (刚入门的编程)的高中 or 大学生leetcode 介绍leetcode 可以说是 cs 最核心的一门“课程”了,虽然不是大学开设的,但基本上每一个现代的高水平的程序员都修过这门“课程”(或者类似的课程,比如数据结构…

平衡小车卡尔曼滤波算法

最近研究STM32的自平衡小车,发现有两座必过的大山,一为卡尔曼滤波,二为PID算法。 网上看了很多关于卡尔曼滤波的代码,感觉写得真不咋地。一怒之下,自己重写,不废话,贴代码 [pre lang"C&quo…