Python中字符编码的概念
在计算机领域,字符编码是将字符集中的字符转化为二进制数据流的过程。Python中字符编码是指将Unicode码点转换为二进制数据流的过程。Unicode是一种标准字符集,包含世界上所有的字符,为每个字符指定一个唯一的码点。
Unicode编码
在Python中,Unicode采用“UTF-8”编码,是一个可变长编码方式,根据字符所需的码位数而改变字节长度,从而使Unicode能够在网络上传输。因为UTF-8中的每个码点都可以由一个或多个字节表示,所以在实现UTF-8编码时,需要决定编码长度的规则。一般来说,UTF-8字符长度的规则如下:
- 1字节编码的范围是U+0000到U+007F;
- 2字节编码的范围是U+0080到U+07FF;
- 3字节编码的范围是U+0800到U+FFFF;
- 4字节编码的范围是U+10000到U+10FFFF。
常见的Unicode编码有UTF-8、UTF-16和UTF-32。其中,UTF-8最常用,因为它可以避免空间浪费,并且支持世界上所有的字符。UTF-16通常用于Windows操作系统和JavaScript编程语言,因为它会比UTF-8节省一些内存。而UTF-32则不常用,因为它的编码长度固定为4字节,会造成空间浪费。
字符编码的转换
在Python中,字符编码的转换可以通过字符编码和解码的方式完成。Python字符编码转换函数如下:
- encode(encoding="utf-8"): 将字符串编码为指定字符集的字节序列,默认为“UTF-8”编码;
- decode(encoding="utf-8"): 将字节序列解码为指定字符集的字符串,默认为“UTF-8”编码。
下面的示例中,演示了Python使用不同字符编码互转时的情况:
```python
# 初始字符串
s = "Hello 你好"
# 编码为“UTF-8”字节序列
s_utf8 = s.encode(encoding="utf-8")
# 编码为“GBK”字节序列
s_gbk = s.encode(encoding="gbk")
# 解码为“UTF-8”字符串
s_decode_utf8 = s_gbk.decode(encoding="gbk").encode(encoding="utf-8")
# 解码为“GBK”字符串
s_decode_gbk = s_utf8.decode(encoding="utf-8").encode(encoding="gbk")
print(s) # Hello 你好
print(s_utf8) # b'Hello \xe4\xbd\xa0\xe5\xa5\xbd'
print(s_gbk) # b'Hello \xc4\xe3\xba\xc3'
print(s_decode_utf8) # b'Hello \xe4\xbd\xa0\xe5\xa5\xbd'
print(s_decode_gbk) # b'Hello \xc4\xe3\xba\xc3'
```
在这个例子中,我们可以看到Python用UTF-8编码对“Hello 你好”进行编码得到了“b'Hello \xe4\xbd\xa0\xe5\xa5\xbd'”这样的字节序列;用GBK编码得到了“b'Hello \xc4\xe3\xba\xc3'”这样的字节序列;最后,我们分别将这些字节序列解码为UTF-8和GBK编码的字符串,可以看到在解码后字符串是不变的。