字符串和字符编码

2020-01-28  本文已影响0人  shayito

ASCIIUnicodeUTF-8
https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896
总结如下

三种编码的对比

Python3用的是Unicode
ord()获取字符的编码
chr()获得编码的字符

>>> ord('中')
20013
>>> chr(25991)
'文'

str:字符类型(Unicode),一字符对应若干字节,形如"xxx",'xxxx'
bytes:比特类型,一字符对应一字节,形如b"xxx",b'xxxx'

Unicode表示的字符可以用encode()方法编码为指定的bytes

# ascii大小写均可
>>> 'ABC'.encode('ascii')  # 纯英文的str可以用ASCII编码为bytes
b'ABC'
>>> '中文'.encode('utf-8')  # 含有中文的str可以用UTF-8编码为bytes
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')  # 含有中文的str无法用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)

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:

>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'

len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数:

>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6

在操作字符串时,为避免乱码,要始终坚持用UTF-8编码对str和bytes进行转换。

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 (没有BOM)编码: 选择UTF-8
上一篇 下一篇

猜你喜欢

热点阅读