前言
python3的str
对象中的元素是Unicode
字符,Python3默认使用UTF-8
编码源码
编码与解码
字符的标识,即码位,范围为0 ~ 1114111
的数字(十进制),(可以理解为不同的数对应不同的字符),在Unicode
中以4 ~ 6
个十六进制数表示,而且加前缀U+
。(注:1byte = 8bit = 两个十六进制数,即以2byte ~ 3byte
表示一个字符,相比而言,ASCII码一个字符用1byte
表示)
字符的具体表述取决于所用的编码。编码是在码位和字节序列之间转换时使用的算法(可以理解为映射方法)。在UTF-8
编码中,A(U+0041)
的码位编码成单个字节\x41
(注:x表示十进制),而在UTF-16LE
编码中编码成两个字节\x41\x00
把码位转换成字节序列的过程是编码
把字节序列转换成码位的过程是解码
|
|
字符串café
有4个Unicode
字符,使用encode()
方法将str
对象转换为bytes
对象b_s
,b_s
有5个字节(é
)
字节概要
bytes
和bytearray
bytes
和bytearray
对象的各个元素是区间[0, 255]
里的整数
|
|
bytes
对象可以从str
对象使用给定的编码构建,bytearray
对象可以使用bytes
对象构建bytes
对象的切片仍旧是bytes
对象,bytearray
对象的切片仍旧是bytearray
对象,s[0] == s[:1]
只对str
这个序列类 型成立bytearray
对象没有字面量句法,而是以bytearray()
和字节序列字面量参数的形式显示
如何找出字节序列的编码
- 一般需要明确的标出
- 使用统一字符编码侦测包
Chardet
进行猜测
处理文本文件
Unicode三明治
:要尽早把输入的字节序列(bytes
)解码(decode
)成字符串(str
);在其他处理过程中,一定不能编码或解码;对输出来说,则要尽量晚地把字符串编码成字节序列。
Unicode
的排序问题
支持字符串和字节序列的双模式API
re
和os
模块能接受字符串或字节序列为参数,然后根据类型展现不同的行
为
ps:这章讨论了太多编码和相关实现了,实在是不感兴趣