软件应用程序经常需要以多种不同的语言显示消息输出,比如英语、法语、日语、希伯来语或印地语。Python 的字符串类型使用 Unicode 标准来表示字符,这使得程序能够处理所有这些不同的可能字符。
字符是文本中可能的最小组成部分。'A'、'B'、'C' 等都是不同的字符。同样,'È' 和 'Í' 也是不同的字符。Unicode 字符串是由一系列码位组成的,这些码位是从 0 到 0x10FFFF(十进制为 1,114,111)的数字。这个码位序列需要在内存中表示为一组码元,而码元再映射到 8 位字节。
字符编码
一个码位序列在内存中表现为一组码元,这些码元映射到 8 位字节。将 Unicode 字符串转换为字节序列的规则称为字符编码。
存在三种主要的编码类型:UTF-8、UTF-16 和 UTF-32。UTF 代表 Unicode 转换格式。
Python 的 Unicode 支持
从 Python 3.0 开始,Python 内置支持 Unicode。str 类型包含了 Unicode 字符,因此任何使用单引号、双引号或三引号语法创建的字符串都存储为 Unicode。Python 源代码的默认编码是 UTF-8。
因此,字符串可以包含 Unicode 字符的字面表示(例如 '3/4'),或者它的 Unicode 值(例如 '\u00BE')。
示例
var = "3/4"
print(var)
var = "\u00BE"
print(var)
上述代码将产生以下输出:
3/4
¾
示例
在下面的例子中,字符串 '10' 是用 '1' 和 '0' 的 Unicode 值 \u0031 和 \u0030 存储的。
var = "\u0031\u0030"
print(var)
它将产生以下输出:
10
字符串以人类可读的格式显示文本,而字节则将字符存储为二进制数据。编码将数据从字符字符串转换为一系列字节。解码将字节翻译回人类可读的字符和符号。重要的是不要混淆这两种方法。encode 是字符串的方法,而 decode 是 Python 字节对象的方法。
示例
在下面的例子中,我们有一个由 ASCII 字符组成的字符串变量。ASCII 是 Unicode 字符集的一个子集。使用 encode() 方法将其转换为字节对象。
string = "Hello"
tobytes = string.encode('utf-8')
print(tobytes)
string = tobytes.decode('utf-8')
print(string)
decode() 方法将字节对象转换回 str 对象。使用的编码方法是 utf-8。
b'Hello'
Hello
示例
在下面的例子中,卢比符号(?)使用其 Unicode 值存储在变量中。我们将字符串转换为字节,然后再转换回 str。
string = "\u20B9"
print(string)
tobytes = string.encode('utf-8')
print(tobytes)
string = tobytes.decode('utf-8')
print(string)
当你执行上述代码时,它会产生以下输出:
?
b'\xe2\x82\xb9'
?