试图发现字符的unicode代码点
我有一个字符,在十六进制编辑器中查看时显示为:试图发现字符的unicode代码点,unicode,binary,utf-16,Unicode,Binary,Utf 16,我有一个字符,在十六进制编辑器中查看时显示为: FF FE 08 27 这意味着它的二进制表示是(四字节编码): 看看unicode,这似乎没有什么意义,因为四字节编码的前导字节必须是11110xxx 我很可能误解了unicode规则,但您能告诉我在确定此字符的代码点时出错的地方吗?unicode字符U+FEFF是字节顺序标记(BOM),表示这是小尾端UTF-16编码,而不是UTF-8。字符为U+2708,或飞机(✈️) 性格 使用Python 3的一点证明: >>>
FF FE 08 27
这意味着它的二进制表示是(四字节编码):
看看unicode,这似乎没有什么意义,因为四字节编码的前导字节必须是11110xxx
我很可能误解了unicode规则,但您能告诉我在确定此字符的代码点时出错的地方吗?unicode字符
U+FEFF
是字节顺序标记(BOM),表示这是小尾端UTF-16编码,而不是UTF-8。字符为U+2708
,或飞机
(✈️) 性格
使用Python 3的一点证明:
>>> import unicodedata as ud
>>> s=b'\xff\xfe\x08\x27'
>>> s.decode('utf16') # Removes BOM and uses indicated little-endian decode.
'\u2708'
>>> s.decode('utf-16le') # explicit decode in little endian leaves BOM.
'\ufeff\u2708'
>>> for c in u: print(ud.name(c))
...
ZERO WIDTH NO-BREAK SPACE # also known as BOM.
AIRPLANE
事实并非如此。它看起来更像UTF-16。我对反对票有点恼火。我将您的编辑回滚到我的答案。
U+FEFF
是正确的,是字节顺序标记。您的原始数据颠倒了表示小尾端的内容。最低有效字节位于第一位。请参阅。
>>> import unicodedata as ud
>>> s=b'\xff\xfe\x08\x27'
>>> s.decode('utf16') # Removes BOM and uses indicated little-endian decode.
'\u2708'
>>> s.decode('utf-16le') # explicit decode in little endian leaves BOM.
'\ufeff\u2708'
>>> for c in u: print(ud.name(c))
...
ZERO WIDTH NO-BREAK SPACE # also known as BOM.
AIRPLANE