《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
【10月更文挑战第6天】「Mac上学Python 11」基础篇5 - 字符串类型详解
本篇将详细介绍Python中的字符串类型及其常见操作,包括字符串的定义、转义字符的使用、字符串的连接与格式化、字符串的重复和切片、不可变性、编码与解码以及常用内置方法等。通过本篇学习,用户将掌握字符串的操作技巧,并能灵活处理文本数据。
55 1
【10月更文挑战第6天】「Mac上学Python 11」基础篇5 - 字符串类型详解
|
1月前
|
自然语言处理 Java 数据处理
【速收藏】python字符串操作,你会几个?
【速收藏】python字符串操作,你会几个?
57 7
|
1月前
|
索引 Python
Python 高级编程:深入探索字符串切片
在Python中,字符串切片功能强大,可灵活提取特定部分。本文详细介绍切片技巧:基本切片、省略起始或结束索引、使用负数索引、设定步长及反转字符串等。此外,还介绍了如何结合其他操作进行切片处理,如先转换大小写再提取子串。 来源:https://www.wodianping.com/yeyou/2024-10/48238.html
39 4
|
2月前
|
网络协议 网络安全 开发者
Python 向IP地址发送字符串
Python 向IP地址发送字符串
|
2月前
|
Python
Python 中取字符串中等于号后面的内容
Python 中取字符串中等于号后面的内容在编程过程中,我们经常需要从字符串中提取特定的信息。一个常见的任务是在给定的字符串中查找等于号(=)后面的内容。这种需求在解析配置文件、处理查询字符串或分析日志数据时尤其常见。 如何实现 在Python中,我们可以使用多种方法来实现此功能。以下是几种常用的方法,包括字符串操作和正则表达式。 方法 1:使用字符串分割 我们可以使用字符串的 split() 方法将字符串拆分为两个部分,然后提取等于号后的值。 示例代码 ----------------------------------- ©著作权归作者所有:来自51CTO博客作者bruce_xiao
|
1月前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
33 0
|
1月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (一)
Python操作:字符串--列表--元组--字典--运算符 (一)
|
1月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (二)
Python操作:字符串--列表--元组--字典--运算符 (二)
|
2月前
|
物联网 Python
python向IP地址发送字符串
python向IP地址发送字符串
|
2月前
|
JSON 数据格式 Python
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
下一篇
无影云桌面