对于单个字符的编码,Python 提供了 ord() 函数来获取字符的整数表示,以及 chr() 函数将编码转换为对应的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
如果你知道字符的整数编码,你也可以像这样用十六进制写 str:
>>> '\u4e2d\u6587'
'中文'
两种写法完全是等价的。
由于Python的字符串类型是str,所以在内存中用Unicode表示,一个字符对应几个字节。如果你想通过网络传输它,或者将它保存到磁盘,你需要将 str 转换为以字节为单位的字节。
Python 使用以 b 为前缀的单引号或双引号来表示字节类型的数据:
x = b'ABC'
注意区分'ABC'和b'ABC',前者是str,后者虽然显示内容和前者一样,但是bytes的每个字符只占一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
纯英文str可以用ASCII编码为字节,内容相同,包含中文的str可以用UTF-8编码为字节。包含中文的str不能用ASCII编码,因为中文编码的范围超出了ASCII编码的范围,Python会报错。
在bytes中,无法显示为ASCII字符的字节,用\x##显示。
相反,如果我们从网络或磁盘读取字节流,则读取的数据是字节。要将字节转换为 str,你需要使用 decode() 方法:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
如果bytes中包含无法解码的字节,decode()方法会报错:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
如果字节中只有少量无效字节,可以通过 errors='ignore' 忽略坏字节:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'
要计算str包含多少个字符,可以用len()函数:
>>> len('ABC')
3
>>> len('中文')
2
len() 函数计算 str 中的字符数。如果用字节代替,len() 函数计算字节数:
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6
可以看出,UTF-8编码后1个汉字通常占用3个字节,而1个英文字符只占用1个字节。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python encode乱码的处理方法01/03
- ♥ 如何在python中使用numpy.append()方法的轴01/09
- ♥ python字符串组合运算符的使用10/15
- ♥ python如何退出脚本11/24
- ♥ 如何在python中使用simhash包11/10
- ♥ 大总结!Python进度条的那些事01/28
内容反馈