Python 3 utf-8编码似乎有问题?

2024-09-28 21:04:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我过去曾在python3.2中搞砸过,但现在我面临着一个关于Python中utf-8编码的混乱局面。
例如,假设我有一段代码:

'א'.encode()

结果是b'\xd7\x90'(或0xD790),但是这是错误的:希伯来语字符Alef的utf-8编码应该是0x5D0
但是,使用utf-16作为编码返回正确的十六进制值,前缀为0xFFFE

^{pr2}$

这将返回b'\xff\xfe\xd0\x05'。在

我觉得我好像在我的理解中遗漏了一些基本的东西,
所以用户们,请帮助教育我!在


Tags: 代码编码错误字符utfencodexffx05
3条回答

否,א的unicode代码点为0x5d0:

print("%x" % ord('א'))  
# '5d0'

当您将其编码为utf-8时,您将得到一种表示该特定代码点的可能方法。utf-16是另一种表示方法,它用2个字节表示每个码位。之所以使用前缀为\xff\xfe,是因为encode('utf-16')生成了一个字节顺序标记(BOM)。如果明确指定字节顺序,则不会生成:

^{pr2}$

0x5d0根本不是编码;它只是一个数字。是的,希伯来语字母ALEF是U+05D0,但是UTF-8不是码位到字节的转录。相反,它在每个字节的msb中使用一组固定的位,并用码位值的可变位数填充lsb。在

0x5d0 = 101 1101 0000
      = 10111 010000

插入110xxxxx 10xxxxxx我们得到:

^{pr2}$

二进制中的unicode codepoint of א is U+05D0,或{}。11位代码点UTF-8编码ABCDEFGHIJKis

110A BCDE  10FG HIJK
# i.e.
1101 0111  1001 0000 # binary
 d    7     9    0   # hex

或者,在Python表示法中,b'\xd7\x90'。在

相关问题 更多 >