编码中的大端序和小端序

 
UTF-16和UTF-32,在计算机上存储字节的时候就分为大端和小端序
 
例如'Ĭ',这个字符对应的unicode 为300
那么这个字符用utf-16编码后,字节是什么样的
 
 
ord('Ĭ')  # 300
 
'Ĭ'.encode('utf-16')
# b'\xff\xfe,\x01'
 
hex(ord(','))  # 0x2c
 
# 所以得到的是 b'\xff\xfe\x2c\x01'
 
'Ĭ'.encode('utf-16le')
# b'\x2c\x01'
 
'Ĭ'.encode('utf-16be')
# b'\x01\x2c'

 

 
就300而言,对应的16进制为 12c,对应的二进制为‭0001 0010 1100‬
300
‭0001 0010 1100‬  (12c)
0000 ‭0001 0010 1100‬
0   1   2   c
 
在没有超过2个字节存储范围时,utf-16最后的编码结果大致和16进制相同
如果是大端存储,\x01\x2c
如果是小端存储,\x2c\x01
当得到的是小端存储,想转换为整数,必须调个顺序,仅在2个字节内调顺序,不是以整体来调顺序
 
以 𪚥为例,这个字用utf-16编码,必须用4个字节(utf-16可以用2个或者4个字节,一般的字符都是用2个)
 
s = '𪚥'
 
s.encode('unicode_escape')  # 这个字符对应的unicode码
# b'\\U0002a6a5'
# 把这个看成16进制,对应的十进制为 173733
 
s.encode('utf-16le')
# b'i\xd8\xa5\xde'
# b'\x69\xd8\xa5\xde'
s.encode('utf-16be')
# b'\xd8i\xde\xa5'
# b'\xd8\x69\xde\xa5'
 
# 充分说明了两点
# 第一,utf-16 大小端,仅在2个字节内倒序
# 第二,utf-16存储4个字节时,和unicode码对应的十六进制不同
 
hex(ord('i'))  # '0x69'
 
s.encode('utf-32le')
# b'\xa5\xa6\x02\x00'
 
s.encode('utf-32be')
# b'\x00\x02\xa6\xa5'
 
# 说明 utf-32,存储4个字节时,和unicode码对应的十六进制大致相同
# utf-32,大小端,在4个字节内倒序

 

http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=2A6A5

 

Glyphs

The Unicode Standard (Version 3.2)Your Browser
𪚥

 

 

Encoding Forms

DecimalUTF-8UTF-16UTF-32
173733 F0 AA 9A A5 D869 DEA5 0002A6A5


 
 
posted @ 2020-08-22 08:14  duohappy  阅读(694)  评论(0编辑  收藏  举报