将代码点(unicode)转换为UTF-16并在Java中打印

时间:2019-07-15 04:58:09

标签: unicode utf-16

我基于这篇文章 https://kishuagarwal.github.io/unicode.html


我举了一个例子:UTF-16 code point 0x1F9F0

在六:

0x1F9F0

以二进制形式:

0001 1111 1001 1111 0000

不允许文章中的解释, 我应该有这样的东西吗?

1101 10XX XXXX XXXX 1101 11XX XXXX XXXX

从do代码点填充的位,请给我

二进制:

1101 1000 0111 1110 1101 1101 1111 0000

六:

\uD87E \uDDF0

但是在this page中 正确的值是:

六:

\uD83E\uDDF0

二进制:

1101 1000 0011 1110 1101 1101 1111 0000

所以...

      my hexa: \uD87E \uDDF0
 correct hexa: \uD83E \uDDF0

我错位了,我不知道为什么...

1 个答案:

答案 0 :(得分:1)

转换0x1F9F00001 1111 1001 1111 0000

在您发布的文章中,我们遵循以下部分:

  

对于从U + 010000到U + 10FFFF的Unicode代码点,...

以及您可能错过的第一步:

  

首先从代码点中减去0x010000,为我们提供了一个20位数字,范围为0x000000到0x0FFFFF。

0x0F9F00000 1111 1001 1111 0000

  

UTF-16将这些范围划分为两个存储区0xD800 ... 0xDBFF和0xDC00 ... 0xDFFF(我们将它们称为A和B),其中每个存储区都有10个空闲位和6个固定位(在图中以灰色显示) 。

或者,如您已经发布的:1101 10XX XXXX XXXX1101 11XX XXXX XXXX

  

我们将求和后得到的20位数字分成两部分,每部分10位。前10位用于填充A的10个空闲位,而其余10位用于填充B的10个空闲位。

产生1101 1000 0011 11101101 1101 1111 000000xD83E 0xDDF0-如预期。