试图发现字符的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