《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中的重要原则。

相关文章
|
4月前
|
Python
python 找到并去除文本中的全部链接
这篇文章提供了一个使用Python正则表达式找到并删除文本中所有链接的代码示例。
|
4月前
|
数据采集 算法 数据可视化
基于Python的k-means聚类分析算法的实现与应用,可以用在电商评论、招聘信息等各个领域的文本聚类及指标聚类,效果很好
本文介绍了基于Python实现的k-means聚类分析算法,并通过微博考研话题的数据清洗、聚类数量评估、聚类分析实现与结果可视化等步骤,展示了该算法在文本聚类领域的应用效果。
136 1
|
1月前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
217 3
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
55 2
|
2月前
|
机器学习/深度学习 自然语言处理 大数据
使用Python进行文本情感分析
【10月更文挑战第2天】使用Python进行文本情感分析
49 3
|
3月前
|
Linux 开发者 iOS开发
Python中使用Colorama库输出彩色文本
Python中使用Colorama库输出彩色文本
|
3月前
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
91 12
|
3月前
|
机器学习/深度学习 自然语言处理 算法
使用Python实现简单的文本情感分析
【9月更文挑战第13天】本文将介绍如何使用Python编程语言进行基础的文本情感分析。我们将通过一个简单的例子,展示如何利用自然语言处理库nltk和机器学习库sklearn来实现对文本数据的情感倾向性判断。文章旨在为初学者提供一个入门级的指导,帮助他们理解并实践文本情感分析的基本步骤和方法。
52 6
|
3月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
55 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
3月前
|
Python
在Python中,文本查找和替换的常用操作
在Python中,文本查找和替换的常用操作,使用字符串方法进行查找和替换,使用正则表达式进行查找和替换,对所查找到的内容进行计数。
36 1