从C编程中从UTF8转换为utf16 le的概念

  • 本文关键字:le utf16 转换 编程 UTF8 c embedded
  • 更新时间 :
  • 英文 :


我想知道从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

最新更新