前言
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:这章讨论了太多编码和相关实现了,实在是不感兴趣