首页 > 解决方案 > Unicode 代码点数组转换为字符串并返回更改

问题描述

具有定义的 Unicode 代码点的数组是:

int[] unicodeDefinedCodePoints = IntStream
            .rangeClosed(Character.MIN_CODE_POINT, Character.MAX_CODE_POINT)
            .filter(Character::isDefined)
            .toArray();

让我们将其转换为字符串并返回代码点:

int[] unicodeDefinedCodePointsAfterTransformation =
            new String(unicodeDefinedCodePoints, 0, unicodeDefinedCodePoints.length)
                .codePoints()
                .toArray();

我希望得到相同的数组,但是

  1. 转换后的数组不包含代码点 56319 和 56320
  2. 代码点 1113088 在转换后被复制

上述代码点的代码是十进制的。

使用的Java版本是:

openjdk version "1.8.0_275"
OpenJDK Runtime Environment (IcedTea 3.17.1) (build 1.8.0_275-b01 suse-1.1-x86_64)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)

有任何想法吗?

谢谢。

标签: javaunicode

解决方案


没有明确的答案

  • 56319 是 U+DBFF,私有高代理,最后。
  • 56320 是 U+DC00,低代理,第一。
  • 1113088 isU+10FC00,无效字符。

可能是先处理高代理,然后处理低代理。无效字符当然是单例黑洞;失败时的替换字符。

对于代理对,只需递减,或用一个代码点制作两个字符串。

int[] unicodeDefinedCodePoints = IntStream
        .rangeClosed(-Character.MAX_CODE_POINT, -Character.MIN_CODE_POINT)
        .map(Math::abs)
        .filter(Character::isValidCodePoint)
        .toArray();

我认为 isDefined 和 isValidCodePoint 之间没有区别,但后者更清楚。


推荐阅读