我想知道从utf8到UTF16 le
的转换概念例如输入序列E3 81 82输出序列为42 30
此转换中的实际算术操作是什么。(我不想称呼内置的库(
基本上,unicode是一种在一个连续的代码空间中表示许多可能符号的方法,每个符号的代码通常称为" 代码点"。 utf-8 和 utf-16 只是一个或多个八位字中的代码点(UTF-8(或16位单词(UTF-16((,最新可以表示为 little-endian ("最不重要的第一"或"英特尔字节订单"(或 big-endian ("大多数(重要的第一个"或"摩托罗拉字节顺序"(序列,这给了我们两个变体:UTF-16LE和UTF-16BE。
首先需要做的是从UTF-8序列提取代码点。UTF-8编码如下:
0x00 ... 0x7f 编码符号" as-is",它对应于标准ASCII符号
但是,如果设置了最重要的位(即 0x80 ... 0xff (,则表示这是几个字节的序列,所有字节均已编码代码点
字节范围 0xc0 ... 0xff 在该序列的第一个位置,在二进制表示中,它们将是:
- 0B 110xxxxx - 1个字节跟随,xxxxx是代码点的5个最重要的位
- 0b 1110xxxx - 2个字节跟随,xxxx是代码点的4个最重要的位
- 0b 11110xxx - 3个字节...
- 0b 111110xx - 4个字节...
目前尚无UNICODE标准中定义的代码点,目前需要超过5个UTF-8字节。
以下字节来自范围 0x80 ... 0xbf (即0b 10xxxxxxxx (,并编码下一个六位(从大多数到最不重要的(来自代码点值。
所以,查看您的示例:E3 81 82
- 0xe3 == 0b 1110 0011 意味着此代码点中将有更多2个字节,而 0011 - 是其中最重要的位置
- 0x81 == 0b 10 000001 表示这不是代码点序列中的第一个字节,它编码下一个6位: 000001
- 0x82 == 0b 10 000010 表示这不是代码点序列中的第一个字节,它编码下一个6位: 000010
即。结果将为 0011 000001 000010 == 0x3042
UTF-16 以相同的方式工作。大多数通常的代码点只是编码为" AS-IS",但一些大的值包装在所谓的"替代对"中,它们是两个16位单词的组合:
- 范围的值 0xD800 ... 0xDBFF 表示它们中的第一个,其10个较低位正在编码结果代码点的10个最重要的位。
- 范围 0xDC00的值... 0xdfff 代表第二个,其下部较低的位正在编码结果代码点的10个最不重要的位。
替代对的值大于0xffff(显而易见(和值0xd800 ... 0xdfff-但是,此范围以替代对的Unicode标准保留,并且不得有此类符号。
> >因此,在我们的示例中
由于在您的示例中给出了UTF-16LE(LITLE-ENDIAN(变体,因此,这意味着首先,在字节序列中,将是该单词的最低意义。即。
0x42 0x30