《Python Cookbook(第2版)中文版》——1.21 在Unicode和普通字符串之间转换

简介:

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

1.21 在Unicode和普通字符串之间转换

任务

需要处理一些可能不符合ASCII字符集的文本数据。

解决方案

普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码:

unicodestring = u"Hello world"
# 将Unicode转化为普通Python字符串:"encode"
utf8string = unicodestring.encode("utf-8")
asciistring = unicodestring.encode("ascii")
isostring = unicodestring.encode("ISO-8859-1")
utf16string = unicodestring.encode("utf-16")
# 将普通Python字符串转化为Unicode:"decode"
plainstring1 = unicode(utf8string, "utf-8")
plainstring2 = unicode(asciistring, "ascii")
plainstring3 = unicode(isostring, "ISO-8859-1")
plainstring4 = unicode(utf16string, "utf-16")
assert plainstring1 == plainstring2 == plainstring3 == plainstring4

讨论

如果想处理含有非ASCII字符的文本数据,首先要懂一些Unicode—什么是unicode、unicode怎么工作、Python如何处理unicode。前一节提供了少量却很重要的指导,本节将在这个话题下继续深入讨论。

不用在完全了解Unicode的一切之后,才去处理现实世界中的有关unicode的问题,但是一些基本知识却是不可或缺的。首先,需要理解字节和字符之间的区别。在过去的以ASCII字符为主体的语言以及环境中,字节和字符被认为是同一种东西。一个字节可以有256个不同的值,因此环境被限制为只能处理不超过256个不同的字符。而另一方面,Unicode则支持成千上万的字符,那也意味着每个unicode字符占用超过1个字节的宽度。因此,首先需要搞清楚字符和字节之间的区别。

标准的Python字符串实际上是字节串,这种字符串中的每个字符,长度为1,实际上就是一个字节。我们还可以用Python的标准字符串类型的其他一些术语来称其为8位字符串或者普通字符串。在本节中,我们称这种类型的字符串为字节串,以此来提醒你它们的单字节的特点。

Python的Unicode字符是一个抽象的对象,它足够大,能够容纳任何字符,可以同Python的长整数进行类比。完全无须担心它的内部表示;只有当你试图将它们传递给一些基于字节处理的函数时—比如文件的write方法和网络socket的send方法,unicode字符的表示才会成为一个问题。基于这个原因,必须选择以何种方式将这些字符表示成字节。将unicode字符串转化成字节串被称为对该字符串编码。同样的,如果从一个文件、socket或者其他基于字节的对象中载入一个unicode字符串,必须对其解码,将其从字节转成字符。

从unicode对象转化成字节串有很多方法,这些方法都被称为某种编码。由于一系列历史的、政治的、以及技术上的原因,没有哪种编码是“正确”的。每种编码都有个大小写不敏感的名字,这个名字可以被传递给encode和decode函数作为参数。下面给出一些应该知道的编码。

  • UTF-8编码可以应用于任何Unicode字符。它也向后兼容ASCII,所以一个纯粹的ASCII文件也可以被认为是一个UTF-8文件,而只使用ASCII字符的UTF-8文件,也完全等同于使用这些字符的ASCII文件。这个属性使得UTF-8具有极好的向后兼容能力,特别是对一些老的UNIX工具来说。UTF-8是迄今为止UNIX上最具主导性的编码,同时也是XML文档的默认编码。UTF-8的主要弱点是,对于一些东方的语言文本,它的效率比较低。
  • UTF-16是微软操作系统和Java环境喜爱的编码。它对于西方语言效率略低,但对于东方语言却更有效率。UTF-16有一个变种,被称为UCS-2。
  • ISO-8859系列的编码是ASCII的超集,每种编码都能处理256个不同的字符。这些编码不能支持所有的Unicode字符;它们只支持一些特定的语系或语言。ISO-8859-1,也以“Latin-1”的名字为人所知,覆盖了大多西欧和非洲的语言,但不包括阿拉伯语。ISO-8859-2,也被称为“Latin-2”,覆盖了很多东欧的语言,比如匈牙利和波兰。ISO-8859-15,现在在欧洲非常流行,基本上它和ISO-8859-1一样,但增加了对欧洲货币符号的支持。

如果想对所有的Unicode字符编码,你可能需要用UTF-8。当需要处理别的程序或者输入设备用其他编码创建的数据时,你才可能需要用到其他编码,或者相反,在需要输出数据给你的下游程序或者输出设备,而它们采用的是另一种特定的编码时。第1.22节展示了一个例子,这个例子中,可以看到怎样通过程序的标准输出来驱动其他下游程序或设备。

相关文章
|
1天前
|
Python
Python避免在字符串和字节之间混淆
【5月更文挑战第5天】Python避免在字符串和字节之间混淆
11 3
|
2天前
|
数据安全/隐私保护 开发者 Python
【Python 基础】检查字符串是否只包含数字和字母?
【5月更文挑战第8天】【Python 基础】检查字符串是否只包含数字和字母?
|
2天前
|
Python
【Python 基础】如何将一个字符串转化为全大写和全小写?
【5月更文挑战第8天】【Python 基础】如何将一个字符串转化为全大写和全小写?
|
2天前
|
机器学习/深度学习 存储 人工智能
python 字符串的三种定义方式
python 字符串的三种定义方式
8 1
|
4天前
|
Python Perl
Python中的字符串分析:判断字符串中是否包含字母
Python中的字符串分析:判断字符串中是否包含字母
10 0
|
4天前
|
C语言 Python
【Python 基础】如何进行字符串插值?
【5月更文挑战第6天】【Python 基础】如何进行字符串插值?
|
4天前
|
存储 监控 Python
python 日期字符串转换为指定格式的日期
python 日期字符串转换为指定格式的日期
14 3
|
5天前
|
数据处理 Python
Python中按指定数量分割列表字符串的方法
Python中按指定数量分割列表字符串的方法
9 1
|
11天前
|
存储 算法 Python
【亮剑】探讨了Python中查找两个字符串差异位置的方法
【4月更文挑战第30天】本文探讨了Python中查找两个字符串差异位置的方法。首先,通过内置函数和基本字符串操作,可以逐个字符比较找到第一个不同位置。其次,利用`difflib`库的`SequenceMatcher`能获取更详细的差异信息。最后,通过实现Levenshtein距离算法,可以计算字符串间的最小编辑距离。根据需求选择合适的方法,能提升代码效率和可读性。
|
12天前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。