使用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
posted @ 2023-10-12 12:28  写bug的民工  阅读(40)  评论(0编辑  收藏  举报