前言

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

把码位转换成字节序列的过程是编码
把字节序列转换成码位的过程是解码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
s = 'café'
print(len(s))
>>>4

b_s = s.encode('utf8')
print(b_s)
>>>b'caf\xc3\xa9'

r = b_s.decode('utf8')
print(r)
>>>café

字符串café有4个Unicode字符,使用encode()方法将str对象转换为bytes对象b_sb_s有5个字节(é)

字节概要

bytesbytearray

bytesbytearray对象的各个元素是区间[0, 255]里的整数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cafe = bytes('café', encoding='utf-8')
print(cafe)
>>>b'caf\xc3\xa9'
print(cafe[0])
>>>99
print(cafe[:1])
>>>b'c'

cafe_arr = bytearray(cafe)
print(cafe_arr)
>>>bytearray(b'caf\xc3\xa9')
print(cafe_arr[-1:])
>>>bytearray(b'\xa9')
  • bytes对象可以从str对象使用给定的编码构建,bytearray对象可以使用bytes对象构建
  • bytes对象的切片仍旧是bytes对象,bytearray对象的切片仍旧是bytearray对象,s[0] == s[:1]只对str这个序列类 型成立
  • bytearray对象没有字面量句法,而是以bytearray()和字节序列字面量参数的形式显示

如何找出字节序列的编码

  • 一般需要明确的标出
  • 使用统一字符编码侦测包Chardet进行猜测

处理文本文件

Unicode三明治:要尽早把输入的字节序列(bytes)解码(decode)成字符串(str);在其他处理过程中,一定不能编码或解码;对输出来说,则要尽量晚地把字符串编码成字节序列。

Unicode的排序问题

支持字符串和字节序列的双模式API

reos模块能接受字符串或字节序列为参数,然后根据类型展现不同的行 为

ps:这章讨论了太多编码和相关实现了,实在是不感兴趣