UTF-16字符串转换原理及十六进制长串疑问解析
关于UTF-16编码的疑问解答
首先看你给出的字节串:
b'\x14\xfeh\x00e\x00l\x00l\x00o\x00 \x00w\x00o\x00r\x00l\x00d\x00'
为什么会看到一长串十六进制字符?
你混淆了「十六进制字符的位数」和「编码单元的位数」:
- 1字节=8位,对应两位十六进制字符(比如0x68就是'h'的ASCII值,两位十六进制)。
- UTF-16的每个基本编码单元是16位,也就是两个字节,对应四位十六进制字符。
你看到的长串,其实是多个UTF-16字符的字节序列连在一起:比如h\x00是两个字节(0x68和0x00),对应'h'的UTF-16小端编码;e\x00是0x65和0x00,对应'e'的UTF-16小端编码。每个字符占两个字节,所以整个字符串的字节流就是一长串十六进制转义序列。
UTF-16如何转换字符串?
UTF-16的转换逻辑很直接:
- 先把字符串里的每个字符映射到Unicode码点(比如'h'对应U+0068,'e'对应U+0065)。
- 对于基本多语言平面(U+0000到U+FFFF)的码点,直接转成一个16位的数值。
- 把这个16位数值拆成两个字节存储,顺序由字节序决定:
- 小端(LE):低字节在前,高字节在后。比如U+0068(0x0068)拆成0x68(h)+0x00,就是你看到的
h\x00。 - 大端(BE):高字节在前,低字节在后,会变成
\x00h。
- 小端(LE):低字节在前,高字节在后。比如U+0068(0x0068)拆成0x68(h)+0x00,就是你看到的
- 对于超出基本平面的码点(U+10000及以上),UTF-16会用两个16位的「代理单元」组合表示,总共占4个字节。
UTF-16背后的核心理论
UTF-16是Unicode字符集的一种编码实现,核心目标是平衡编码效率和兼容性:
- Unicode给全球几乎所有字符分配了唯一的数字标识(码点),解决了不同字符集的混乱问题。
- UTF-16用16位作为基本单元,既能直接覆盖绝大多数常用字符(基本平面),又能通过代理对扩展到所有Unicode码点。
- 字节序的存在是因为不同硬件系统存储多字节数据的顺序不同,所以需要用字节顺序标记(BOM,比如
\xff\xfe表示小端,\xfe\xff表示大端)来告诉解码器如何解析字节流。你给出的字节串开头\x14\xfe不是标准UTF-16 BOM,可能是数据本身的特殊前缀,不影响后面字符的编码逻辑。
内容的提问来源于stack exchange,提问作者user20144486
相关产品推荐
相关产品推荐

