unicode - utf 8 手动将 unicode codepoints转换为 utf 8 和 UTF 16

  显示原文与译文双语对照的内容
118 5

我有一个大学的编程考试,一个部分是 unicode 。

我已经经检查了这个问题,我的演讲者无用,所以这是帮助你们的最后一个办法。

这个问题将是类似的:

字符串'mЖ丽'有这些 unicode codepoints U+006DU+0416U+4E3D,用十六进制编写答案,手动将字符串编码为 UTF-8 和 UTF-16.

任何帮助都会大大感谢,因为我正在尝试让我的头绕着这个。

时间:原作者:0个回答

109 5

一方面,我很高兴知道大学课程正在学习字符编码,但实际上知道 UTF-8 编码规则很好。( 它能帮助学生通过土耳其测试)?

到目前为止,对于将 UCS codepoints编码到 UTF-8的规则来说,最清晰的描述是来自许多Linux系统的utf-8(7) 页面:

Encoding
 The following byte sequences are used to represent a
 character. The sequence to be used depends on the UCS code
 number of the character:
 0x00000000 - 0x0000007F:
 0xxxxxxx
 0x00000080 - 0x000007FF:
 110xxxxx 10xxxxxx
 0x00000800 - 0x0000FFFF:
 1110xxxx 10xxxxxx 10xxxxxx
 0x00010000 - 0x001FFFFF:
 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
 [... removed obsolete five and six byte forms.. .]
 The xxx bit positions are filled with the bits of the
 character code number in binary representation. Only the
 shortest possible multibyte sequence which can represent the
 code number of the character can be used.
 The UCS code values 0xd800–0xdfff (UTF-16 surrogates) as well
 as 0xfffe and 0xffff (UCS noncharacters) should not appear in
 conforming UTF-8 streams.

记住图表的'压缩'版本可能会更容易:

初始字节开始于错误的codepoints开始以 1 开头,并添加填充 1+0后续字节开始 10

0x80 5 bits, one byte
0x800 4 bits, two bytes
0x10000 3 bits, three bytes

通过注意在新表示中允许的位数,你可以通过注意空间来派生范围:

2**(5+1*6) == 2048 == 0x800
2**(4+2*6) == 65536 == 0x10000
2**(3+3*6) == 2097152 == 0x200000

我知道 remember derive图表的规则,比图表本身容易得多。希望你能很好地记住规则。: )

更新

建立图表后,可以通过在它的范围内找到输入 Unicode codepoints,再从十六进制转换成二进制,再根据上面的规则插入位,然后转换回十六进制,从而转换为 UTF-8:

U+4E3E

这适用于 0x00000800 - 0x0000FFFF 范围( 0x4E3E <0xFFFF ),因此表示形式将为:

 1110xxxx 10xxxxxx 10xxxxxx

0x4E3E100111000111110b 将这些位放到( 从右边开始,我们会在开始时用 0 填充丢失的位) 上面的x 中:

 1110x100 10111000 10111110

在开始处还有一个 x 位置,用 0 填充它:

 11100100 10111000 10111110

位转换为十六进制字符:

 0xE4 0xB8 0xBE
原作者:
...