《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节展示了一个例子,这个例子中,可以看到怎样通过程序的标准输出来驱动其他下游程序或设备。

相关文章
|
18天前
|
Python
1167: 分离字符串(PYTHON)
1167: 分离字符串(PYTHON)
|
1月前
|
大数据 Python
使用Python查找字符串中包含的多个元素
本文介绍了Python中查找字符串子串的方法,从基础的`in`关键字到使用循环和条件判断处理多个子串,再到利用正则表达式`re模块`进行复杂模式匹配。文中通过实例展示了如何提取用户信息字符串中的用户名、邮箱和电话号码,并提出了优化策略,如预编译正则表达式和使用生成器处理大数据。
20 1
|
2天前
|
Python
Python 字符串格式化指南
本文介绍了Python中的三种字符串格式化方法:1) 使用 `%` 操作符,如 `%s` 和 `%d`;2) `str.format()` 方法,通过 `{}` 占位符插入变量;3) Python 3.6 引入的 f-strings,直接在字符串内嵌入变量。此外,还提到了高级用法,如格式控制(如指定小数位数)。这些方法有助于更有效地处理和格式化字符串输出。
3 0
|
9天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
49 0
|
10天前
|
数据采集 Python
python学习9-字符串
python学习9-字符串
|
18天前
|
Java 索引 Python
Python标准数据类型-字符串常用方法(下)
Python标准数据类型-字符串常用方法(下)
21 1
|
18天前
|
XML 编解码 数据格式
Python标准数据类型-String(字符串)
Python标准数据类型-String(字符串)
23 2
|
18天前
|
Python
171: 字符串的倒序(python)
171: 字符串的倒序(python)
|
1月前
|
JSON C++ 数据格式
【Python 基础教程 08】全面入门到精通:Python3 字符串操作实战教程与深度指南
【Python 基础教程 08】全面入门到精通:Python3 字符串操作实战教程与深度指南
87 0
|
编译器 数据处理 索引
【python】—— 字符串详解
【python】—— 字符串详解