从ASCII
到Unicode
到UTF-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编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
网友评论