奇奇怪怪的编码格式
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-16LElittle-endian,小端的意思。小端就是将高位的字节放在高地址表示。
  • UTF-16: 不知道其是大小端,所以其开始的两个字节表示该字节数组是大端还是小端。

在python中使用utf-16读取时会智能识别BOM,而如果文件没有BOM,则默使用小端。写入时也是使用小端,而且会写入BOM。 而标明了大小端的utf-16leutf-16be则不会写入BOM,读取时也不会识别BOM,会把BOM当成未知unicode字符。


最后修改于 2024-10-07