奇奇怪怪的编码格式
python中的编码
UTF一家
python 支持的编码格式可以看 https://docs.python.org/3/library/codecs.html#standard-encodings
utf-8 with bom
BOM的意思就是Byte Order Mark
,用来标记字节顺序,具体可以看utf-16
'hello'.encode('utf_8_sig') # b'\xef\xbb\xbfhello'
整个结果里最开始的3个byteefbbbf
,就是BOM了。
bom是为utf-16和utf-32准备的,用于标记字节顺序。微软在utf-8中使用bom是因为这样可以把UTF-8和ASCII等编码区分开来,但这样的文件在windows之外的操作系统里会带来问题。
utf-16/utf-16be/utf-16le
utf-16系列最小的长度就是2个字节,所以在表示英文字符居多的文本的时候不是很推荐,但表示中文等其他语言往往表现更好。
s = 'hello'
s.encode('utf-16') # b'\xff\xfeh\x00e\x00l\x00l\x00o\x00'
s.encode('utf-16be') # b'\x00h\x00e\x00l\x00l\x00o'
s.encode('utf-16le') # b'h\x00e\x00l\x00l\x00o\x00'
可以发现,utf-16比另外两个多了个fffe
,表示这是这个其实就是BOM,这里表示的是小端,另外feff
表示的是大端。
- UTF-16BE: big-endian,大端的意思。大端就是将高位的字节放在低地址表示。
- UTF-16LE: little-endian,小端的意思。小端就是将高位的字节放在高地址表示。
- UTF-16: 不知道其是大小端,所以其开始的两个字节表示该字节数组是大端还是小端。
在python中使用utf-16
读取时会智能识别BOM,而如果文件没有BOM,则默使用小端。写入时也是使用小端,而且会写入BOM。
而标明了大小端的utf-16le
和utf-16be
则不会写入BOM,读取时也不会识别BOM,会把BOM当成未知unicode字符。
最后修改于 2024-10-07