0

ucs-4字符''的unicode值是,在intelliJ IDEA中复制到java代码时0001f923会自动变为对应的值。\uD83E\uDD23

Java 仅支持 ucs-2,因此发生了从 ucs-4 到 ucs-2 的转换。

我想知道转换的逻辑,但没有找到任何关于它的材料。

4

2 回答 2

2

https://en.wikipedia.org/wiki/UTF-16#U+010000_to_U+10FFFF

U+010000 至 U+10FFFF

  • 从代码点 (U) 中减去 0x10000,在 0x00000–0xFFFFF 范围内留下一个 20 位数字 (U')。U 被定义为不大于 0x10FFFF。
  • 高十位(在 0x000–0x3FF 范围内)被添加到 0xD800 以给出第一个 16 位代码单元或高代理 (W1),它将在 0xD800–0xDBFF 范围内。
  • 将低十位(也在 0x000–0x3FF 范围内)添加到 0xDC00 以提供第二个 16 位代码单元或低代理 (W2),其范围为 0xDC00–0xDFFF。

现在输入代码点 \U1F923:

  • \U1F923 - \U10000 = \UF923
  • \UF923 = 1111100100100011 = 00001111100100100011 = [0000111110][0100100011] = [\U3E][\U123]
  • \UD800 + \U3E = \UD83E
  • \UDC00 + \U123 = \UDD23
  • 结果:\UD83E\UDD23

编程:

public static void main(String[] args) {
    int input = 0x1f923;
    int x = input - 0x10000;

    int highTenBits = x >> 10;
    int lowTenBits = x & ((1 << 10) - 1);

    int high = highTenBits + 0xd800;
    int low = lowTenBits + 0xdc00;

    System.out.println(String.format("[%x][%x]", high, low));
}
于 2019-09-16T10:11:00.940 回答
1

虽然String包含 Unicode 作为一个char数组,其中char是一个两字节的 UTF-16BE 编码,但也支持 UCS4。

UCS4:UTF-32,“代码点”:

Unicode 代码点 UCS4 在 java 中表示为int.

int[] ucs4 = new int[] {0x0001_f923};
String s = new String(ucs4, 0, ucs4.length);
ucs4 = s.codePoints().toArray();

编码、转换、编码点到 UTF-16 和 UTF-8 分别需要更长的 2 字节或 1 字节值序列。选择编码使得 2/1 字节值将不同于任何其他值。这意味着这样的值不会错误地匹配"/"或任何其他字符串搜索。这是通过高位开始的1...,然后是大端格式的代码点的位(最高有效位在前)。

不是搜索 UCS4 和 UCS2,而是搜索 UTF-16 将产生有关所使用算法的信息。

于 2019-09-16T11:27:00.843 回答