编码中的大端序和小端序
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
Decimal | UTF-8 | UTF-16 | UTF-32 |
---|---|---|---|
173733 | F0 AA 9A A5 | D869 DEA5 | 0002A6A5 |
写出生活