1、字节流与字符串的转换

内置函数bytes()与str()

bytes()函数可以将字符串按照某一编码规范转换为字节流。其中第一个参数为字符串,第二个参数为编码规范(必填)。如果第一个参数是仅由ascii码字符(ascii码字符是unicode码字符的子集)组成的,则字节流直接以ascii码字符显示。如果不是的话,则在按照不同的编码规范显示。在utf-8编码下,一个汉子占三个字节(一个字节是8位二进制数,可用2个16进制数表示),于是一个汉字可以表示为b'\x00\x00\x00'的形式。在unicode编码下,一个汉字占2个字节,可用4个16进制数表示,于是一个汉字可以表示为b'\u0000'。

>>> hw = '好玩'
>>> bytes(hw,'utf-8')    #utf-8编码
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> bytes(hw,'unicode-escape')    #unicode编码
b'\\u597d\\u73a9'
>>> bytes(hw,'gbk')    #gbk编码
b'\xba\xc3\xcd\xe6'
>>> bytes(hw,'gb2312')	#gb2312编码
b'\xba\xc3\xcd\xe6'

与bytes()函数相对应的是内置函数str(),str()函数的一个功能是能将某一编码下的字节流解码为字符串。

>>> hw = '好玩'
>>> b_utf = bytes(hw,'utf-8')
>>> b_utf
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> str(b_utf,'utf-8')
'好玩'

>>> b_uni = bytes(hw,'unicode-escape')
>>> b_uni
b'\\u597d\\u73a9'
>>> str(b_uni,'unicode-escape')
'好玩'

>>> b_gbk = bytes(hw,'gbk')
>>> b_gbk
b'\xba\xc3\xcd\xe6'
>>> str(b_gbk,'gbk')
'好玩'

字符串函数encode()与decode()

python还可以对字符串进行编码和解码,这里的字符串一般是指人类能够识别的具有语义的符号。使用函数encode()进行编码,使用函数decode()对字节流进行解码。所谓编码就是将字符串转换成计算机能读懂的字节流,所谓解码就是将字节流转化成字符串。与bytes相比,encode()和decode()具有默认的编码格式utf-8,而bytes()必须制定编码格式。

# 字符串编码函数encode()
>>> hw
'好玩'
>>> hw.encode()
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> hw.encode('utf-8')	#由此可见utf-8是默认的编码格式
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> hw.encode('gbk')
b'\xba\xc3\xcd\xe6'
>>> hw.encode('unicode-escape')
b'\\u597d\\u73a9'
>>> hw.encode('gb2312')
b'\xba\xc3\xcd\xe6'

# 字符串解码函数decode()
>>> hw
'好玩'
>>> hw_d = hw.encode('utf-8')
>>> hw_d
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> hw_d.decode()
'好玩'

2、字符的unicode编码

字符通过内置函数ord()与chr()进行编码,ord()可以返回单一字符的Unicode编码,chr()可以返回与Unicode编码相对于的单一字符。

# ord()函数10进制的形式返回一个字符的Unicode编码
>>> ord('中')
20013
>>> ord('A')
65
>>> ord('9')
57

# chr()函数可以返回各种进制下Unicode编码的字符
# 1)'A'的十进制Unicode编码是65,以下分别将其转化为二进制、八进制、十六进制
>>> bin(65)
'0b1000001'
>>> oct(65)
'0o101'
>>> hex(65)
'0x41'

# 2)利用chr()函数将不同进制下的Unicode编码转换成Unicode字符,ascii码是Unicode码的子集。
>>> chr(65)
'A'
>>> chr(0b1000001)
'A'
>>> chr(0o101)
'A'
>>> chr(0x41)
'A'

3、字符与bytes的联系

# 通过内置函数bytes()得到'好'的Unicode编码
>>> h = '好'
>>> bytes(h,'unicode-escape')
b'\\u597d'

# 通过内置函数ord()得到'好'的unicode编码的序数形式
>>> ord(h)
22909

# 验证通过bytes()与ord()得到的Unicode编码是否一致
>>> bytes(h,'unicode-escape')
b'\\u597d'
>>> bin(int('5',16))	#以下分别求5、9、7、d的二进制数
'0b101'
>>> bin(int('9',16))
'0b1001'
>>> bin(int('7',16))
'0b111'
>>> bin(int('d',16))
'0b1101'
>>> int('101100101111101',2)	#将二进制数拼接起来计算其十进制数
22909

通过以上实验可以得到结论:使用内置函数ord()获得的unicode编码与通过内置函数bytes()获得的unicode编码相一致,只是展现形式不同而已。