《Python Cookbook(第2版)中文版》——1.20 使用Unicode来处理国际化文本-阿里云开发者社区

开发者社区> 异步社区> 正文

《Python Cookbook(第2版)中文版》——1.20 使用Unicode来处理国际化文本

简介:
+关注继续查看

本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.20节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.20 使用Unicode来处理国际化文本

任务

需要处理包含了非ASCII字符的文本字符串。

解决方案

可以在一些使用普通的字节串str类型的场合,使用Python提供的内置的unicode类型。用法很简单,只要接受了在字节串和unicode字符串之间的显式转换的方式:

>>> german_ae = unicode('\xc3\xa4', 'utf8')

这里german_ae是一个unicode字符串,代表了小写的德语元音变音(umlaut,或其他分音符)字符“æ”。根据指定的UTF-8编码方式,通过解析单字节字符串'xc3xa4',这段代码创建了一个unicode字符串。还有很多其他的编码方式,不过UTF-8最常用,因为它是最通用的(UTF-8可以编码任何unicode字符串),而且也和7位的ASCII字符集兼容(任何ASCII单字节字符串,也是正确的UTF-8编码字符串)。

一旦跨过这一屏障,生活就变得更美好了!可以像处理普通的str字符串那样操纵unicode字符串:

>>> sentence = "This is a " + german_ae
>>> sentence2 = "Easy!"
>>> para = ". ".join([sentence, sentence2])

注意,para是一个unicode字符串,这是因为一个unicode字符串和一个字节串之间的操作总会产生一个unicode字符串—除非这个操作发生错误并抛出异常:

>>> bytestring = '\xc3\xa4'     #某个非ASCII字节串
>>> german_ae += bytestring
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in 
position 0: ordinal not in range(128)

字符’0xc3’不是7位ASCII编码中的有效字符,Python也拒绝猜测其编码。所以,在Python中使用unicode的关键点是,你要随时明确编码是什么。

讨论

如果你遵守一些规范,并且学会处理一些常见的问题,则Python中的unicode处理是非常简单的事情。这不是说完成一个高效的Unicode实现是个简单的任务。不过,正如其他的一些难题一样,无须担心太多:只管使用Python的高效的Unicode实现就行了。

最重要的一点是,首先要完全接受字节串和unicode字符串的差异。正如解决方案小节所示,你经常需要通过一个字节串和一个编码方式显式地创建一个unicode字符串。不指定编码方式,字节串基本没有什么意义,除非你很有运气而且碰巧那个字节串是ASCII文本。

在Python中使用unicode字符串的最常见的问题是,你正在处理的文本一部分是unicode对象,另一部分则是字节串。Python会简单地尝试把你的字节串隐式地转换成unicode。它通常假设那些是ASCII编码,如果其中碰巧含有了非ASCII字符,它会给你一个UnicodeDecodeError的异常。UnicodeDecodeError异常通知你,你把Unicode和字节串混在了一起,而且Python无法(它根本也不会去尝试)猜测你的字节串代表何种文本。

各个Python大项目的开发人员们总结出了一些简单的规则,来避免这种运行时的UnicodeDecodeError异常,该规则可以被总结为一句话:总是在IO动作的关口做转换。下面更深入地解释一下。

  • 无论何时,当你的程序接收到了来自“外部”的文本数据(来自网络、文件、或者用户输入等)时,应当立刻创建一个unicode对象,找出最适合的编码,如查看HTTP头,或者寻找一个合适的转化方法来确定所用的编码方式。
  • 无论何时,当你的程序需要向“外部”发送文本数据(发到网络、写入文件、或者输出给用户等)时,应当探察正确的编码,并用那种编码将你的文本转化成字节串。(否则,Python会尝试把Unicode转成ASCII字节串,这很有可能发生UnicodeEncodeError异常,正好是前面例子中给出UnicodeDecodeError的相反情况)。

遵循这两个规则,可以解决绝大多数的Unicode问题。如果你仍然遇到了那两种UnicodeError之一,应当赶快检查是否忘记了在什么地方创建一个unicode对象,或者忘记了把它转化为编码过的字节串,再或者使用了完全不正确的编码方式。(编码错误也有可能来自于用户,或者其他与你的程序进行交互的程序,因为它们没有遵循编码规则或惯例。)

为了将一个Unicode字符串转回到编码过的字节串,你通常可以这么做:

>>> bytestring = german_ae.decode('latin1')
>>> bytestring
'\xe4'

现在,bytestring是德语中的用’latin1’进行编码的æ字符。注意,’xe4’(Latin1)以及前面展示的’xc3xa4’(UTF-8)代表了同样的德语字符,但使用了不同的编码。

至此为止,应该能够了解为什么Python拒绝在几百种可能的编码中进行猜测了吧。这是一种很重要的设计选择,基于了Zen of Python原则中的一条:“在模糊含混面前拒绝猜测。”在任何一个Python的交互式shell提示符下,输入import this语句,你就可以阅读Zen of Python中的重要原则。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Unicode转中文,Unicode编码转换,ASCII转Unicode,Unicode转ASCII
DEMO https://oktools.net/unicode Unicode转中文 function decodeUnicode() { let input = area_input.
5708 0
关于Jupyter notebook的安装以及一些使用心得
Jupyter notebook Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。
1257 0
MaxCompute(ODPS)上处理非结构化数据的Best Practice
随着MaxCompute(ODPS)2.0的上线,新增的非结构化数据处理框架也推出一系列的介绍文章,包括 MaxCompute上如何访问OSS数据, 基本功能用法和整体介绍,侧重介绍读取OSS数据进行计算处理; 本文:MaxCompute(ODPS)上处理非结构化数据的Best Practice。
4138 0
self的使用 | 手把手教你入门Python之五十二
通过 self.属性名 可以访问到这个对象的属性;通过 self.方法名() 可以调用这个对象的方法。
950 0
gitbook 简单使用
gitbook 简单使用 之前由于公司培训过使用 gitbook,当时也没有进行安装使用。当时就感觉就是 markdown 语法,加上我本来就是使用 markdown 进行写博客之类。再加上这个东西本身我也用不到,于是也没有弄弄玩玩。
1416 0
《jQuery Cookbook中文版》——1.17 在不造成全局冲突的情况下使用$别名
这样做的另一个好处是包含在匿名的自调用函数中的代码将运行于自己的私有作用域中。可以确信,在该函数中放置的任何内容都决不会和全局作用域中编写的任何其他JavaScript代码发生冲突。同样,为什么要冒编程冲突的风险?你要做的只不过是创建自己的私有作用域。
864 0
《jQuery Cookbook中文版》——1.16 获取和设置文本内容
重要的一点是,要记住text()方法与html()方法没有什么不同,唯一的例外是text()方法将对HTML进行转义(将<和>替换为HTML实体)。这意味着,如果在text()方法的字符串参数中放入标记,该方法会将这些标记转换为HTML实体(&lt;和&gt;)。
857 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载