python字符串的编码问题

时间:2023-01-03 23:41:16

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000

由以上内容的思考:

python中字符串的默认编码是Unicode编码,但是在实际运用中市场需要Unicode和UTF-8(包含了ASCII)之间的转换。

ASCII编码:一个字符由1个byte(8位二进制/8bits)表示;

Unicode编码:一个字符由2个byte表示;

UTF-8编码:一个字符由1个或者多个byte表示,“可变长编码”,向下覆盖了ASCII编码。

编码格式就是一张带角标的字符表,区别是角标的表示位数。

如果知道字符的整数编码(默认都是Unicode编码),还可以用十六进制这么写str

#\u表示Unicode编码,4e2d和6587位16进制数,2位表示一个byte,Unicode有4位表示2个字节
>>> '\u4e2d\u6587'
'中文'

但是要传输和存储动作时,需要将Unicode码转化为字节码bytes数据类型,这一数据类型就是按照ASCII和UTF-8编码的,在纯英文和数字及普通字符时就是ASCII编码格式。

其实保存到磁盘时所以一般都选UTF-8编码格式,是指在保存和读取时使用该格式编码和解码,我们写的python代码直接使用Unicode(编辑的时候实际上都存储在内存中)。

eg:记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

python字符串的编码问题

bytes数据类型有固定表示:b

x = b'ABC'

对于理解这里需要知道,使用byte数据类型就是读取或者写入一个一个字节,计算机就是这么干的。

编码:

>>> '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)

解码:

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

1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

在操作字符串时,我们经常遇到strbytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对strbytes进行转换。

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

# -*- coding: utf-8 -*-