为什么在utf-16中将空字符串''编码为2个字节,而在utf-8或ascii中编码为0个字节?

时间:2019-05-14 02:01:28

标签: python python-3.x utf-8 utf-16 utf

我只是在学习有关在python中编码字符串的知识,对它有点烦躁之后,我对以下事实感到困惑:在utf 8和ascii中,空字符串('')的大小为0,而在utf 16中则为2 ?怎么来的?

from matplotlib import pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))

pd.value_counts(df['Country']).plot('barh', ax=ax1)
pd.value_counts(df['Company']).plot('barh', ax=ax2)

我想问题的很大一部分是我不了解utf 16的工作原理。我不明白为什么在utf 16中编码“垃圾邮件”会长10个字节,而不是8个字节(每个字符2个字节(16位))。我假设在utf 16中默认需要2个字节作为填充字符串或其他东西的默认值?

*编辑

对于UTF 8或UTF 16的工作原理,我并不感到困惑,在存储每个字符方面也有所不同。我对缺少任何字符(一个空字符串)如何存储在UTF 16中的2个字节中但在UTF 8中具有0个字节的情况感到困惑(相对于两者均为1字节或0)

该链接未提供我问题的答案。

1 个答案:

答案 0 :(得分:4)

默认情况下,Python编码为UTF-16时包含Byte Order Mark,但编码为UTF-8时不包含。{p>

>>> ''.encode('utf16')
b'\xff\xfe'
>>> ''.encode('utf8')
b''

您可以通过使用BE(大尾数)或LE(小尾数)后缀明确指定字节顺序来取消BOM。

>>> ''.encode('utf-16-le')
b''