字符串和编码

这篇笔记我们介绍Python的字符串数据类型以及字符串编码相关的知识。Python2和Python3在字符串编码方便有较大区别,这里为了避免混淆,完全移除了Python2相关的内容,仅介绍Python3版本中的实现方式。

定义字符串变量

Python没有单独的字符类型,只有字符串。字符串是由一串字符组成的数据类型,通常用于存储文本数据。Python中字符串字面量可以用''""定义,两者没有区别,PEP8规范要求代码中尽量统一使用单引号或双引号。

message: str = 'Hello, world!'

同其他语言一样,Python也使用\作为转义字符。

message: str = "What is the meaning of \"life\"?"

Python中字符串字面量还有一种很特殊的表示方法,Unicode转义序列。这种字符串每个字符以\u开头,后面是字符Unicode码的16进制表示,例如\u4f60中,其实0x4f06就是中文字符的16进制Unicode码。

message: str = '\u4f60\u597d\uff0c\u4e16\u754c'

多行字符串

Python中我们还可以使用多行字符串字面量,这需要使用三个引号"""定义。

text: str = """
Title: Tom and Jerry
Description: "Tom and Jerry" is a classic animated comedy series that was created by William Hanna and Joseph Barbera for MGM in 1940. 
"""

格式化字符串

Python还支持格式化字符串,下面介绍Python中的三种格式化字符串的语法。

name: str = 'Tom'
age: int = 18
# 使用百分号%格式化字符串
text1: str = 'Hello, my name is %s and I am %d years old.' % (name, age)
# 使用字符串的format方法格式化字符串
text2: str = 'Hello, my name is {} and I am {} years old.'.format(name, age)
# 使用f-string语法格式化字符串
text3: str = f'Hello, my name is {name} and I am {age} years old.'

以上格式化字符串结果都是Hello, my name is Tom and I am 18 years old.。其中前两种使用百分号%format()方法格式化字符串的写法是较早期的Python版本支持的,f-string语法则是Python3.6版本引入的,目前推荐使用f-string语法,前两种仅作了解,这些字符串格式化语法也适用于多行字符串。

字符和Unicode码之间的转换

Python3中,字符串在内存中使用Unicode码表示,内存中具体使用UTF-8、UTF-16等哪种编码方式则和解释器的实现相关,我们不必关心。

ord()方法可以将字符转换为Unicode码,chr()方法则可以将Unicode码转换为字符,不过由于Unicode码是兼容ASCII码的,因此对于英文等ASCII支持的字符,我们也可以将其看作是字符和ASCII码之间的转换。

a: int = ord('A')
b: str = chr(65)

注意:我们不要混淆Unicode和UTF-8、UTF-16等具体编码的概念。Unicode规定了一种字符集,每个字符对应一个数字标号,它可以理解为一个规则表格,我们可以找到一个字符对应的唯一数字也可以根据数字找到对应的字符;而UTF-8、UTF-16等是具体的编码方式,它可以理解为一种具体如何将Unicode码转换为字节序列的程序逻辑,UTF-8、UTF-16等是这一逻辑的不同实现方式。

将字符编码为字节序列

Python提供了bytes类型来表示字节序列,我们可以将字符串以某种编码(如UTF-8等)编码为字节序列,也可以从字节序列创建字符串。

text: str = '你好,世界'
# 使用UTF-8编码为字节序列
text_bytes: bytes = text.encode('utf-8')
# 使用UTF-8解码字节序列为字符串
text_src: str = text_bytes.decode('utf-8')

encode()方法将字符串以指定的编码规则转换为字节序列,而decode()方法将字节序列以指定的编码规则解析为字符串。

注意:上面代码中,我们如果打印text_bytes可能会得到类似b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c'这样的结果,Python中bytes类型其实也是可以用字面量表示的!它的字面量写法是类似b'\xe4'的形式,以b开头,内部使用\x接一个16进制数表示一个字节,如果有多个字节则可以使用多个连续的\x序列。下面代码我们使用字面量创建了一个bytes类型的变量data,然后使用decode()方法将其解码为字符串。

data: bytes = b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c'
text: str = data.decode('utf-8')

这里我们就不得不再次提醒,不要把Unicode和UTF-8弄混淆。前面我们介绍过\u序列,它是Unicode转义序列表示若干个Unicode码,而不是真正放在内存或磁盘里的数据;而这里的\x序列是字节序列,每个\x表示一个字节,合起来是字符串使用UTF-8编码后的二进制数据,这段数据才可以用于网络传输或是存储到磁盘上。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap