使用python来对字符编码序列进行互转
排查字符集问题时,有的时候发生乱码不知道如何生成的字符,此时就需要通过字节序列来判断该字符是什么。
已知utf8字节序列时,转换为unicode或者gb18030字节序列:
>>> a = b'\xef\xbc\xa1' # 此时a是一个bytes对象
>>> b = a.decode("utf8") #此时b是一个str对象,内部是unicode的编码字节序列,其实是全角的字母字符A
>>> b
'A'
>>> b.encode('unicode_escape') #经过encode函数得到一个bytes对象,它是一个字节序列,长度为6, 第一个是\, 第2个是u, 第3个是f, 以此类推
b'\\uff21'
>>> b.encode("gb18030") #经过encode函数得到一个bytes对象,它是一个字节序列,长度为2,第一个是\xa3, 第2个是\xc1
b'\xa3\xc1'
已知gb18030字节序列时,转换为unicode或者utf8字节序列:
>>> a = b'\xa3\xc1' # 此时a是一个bytes对象
>>> b = a.decode("gb18030") #此时b是一个str对象,内部是unicode的编码字节序列,其实是全角的字母字符A
>>> b
'A'
>>> b.encode('unicode_escape') #经过encode函数得到一个bytes对象,它是一个字节序列,长度为6, 第一个是\, 第2个是u, 第3个是f, 以此类推
b'\\uff21'
>>> b.encode("utf8") #经过encode函数得到一个bytes对象,它是一个字节序列,长度为3,第一个是\xef, 第2个是\xbc, 第3个是\xa1
b'\xef\xbc\xa1'
已知unicode字节序列时,转换为gb18030或者utf8字节序列:
>>> a = b'\\uff21' # 此时a是一个bytes对象
>>> b = a.decode("unicode_escape") #此时b是一个str对象,内部是unicode的编码字节序列,其实是全角的字母字符A
>>> b
'A'
>>> b.encode("gb18030") #经过encode函数得到一个bytes对象,它是一个字节序列,长度为2,第一个是\xa3, 第2个是\xc1
b'\xa3\xc1'
>>> b.encode("utf8") #经过encode函数得到一个bytes对象,它是一个字节序列,长度为3,第一个是\xef, 第2个是\xbc, 第3个是\xa1
b'\xef\xbc\xa1'
如何通过一个int类型的list构造一个bytes对象:
>>> int_list = [ord('\\'), ord('u'), ord('f'), ord('f'), ord('2'), ord('1')]
>>> int_list
[92, 117, 102, 102, 50, 49]
>>> a = bytes(int_list)
>>> a
b'\\uff21'
>>> a.decode("unicode_escape")
'A'
对于'A'这个字符,它在不同编码格式下的字节序列如下:
编码格式\字节下标序列: | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
unicode_escape | \ | u | f | f | 2 | 1 |
gb18030 | 0xa3 | 0xc1 | ||||
utf8 | 0xef | 0xbc | 0xa1 |