我想要一个可以指示 Unicode 点是否有效的算法或库。例如U+F8F8
,看起来不是有效的 Unicode 字符,但被描述为"PRIVATE_USE_AREA"
. 我找到了ICU - 这是一个好的/最好的解决方案吗?
更新:@Reprogrammer 的建议(如下)是使用:
CoderResult call(CharsetDecoderICU decoder, Object context,
ByteBuffer source, CharBuffer target, IntBuffer offsets,
char[] buffer, int length, CoderResult cr)
This function is called when the bytes in the source cannot be handled,
and this function is meant to handle or fix the error if possible.
谢谢。这看起来比我希望的要复杂 - 也许它必然是一个比我想象的更复杂的问题。(问题包括一些点,例如'<Non Private Use High Surrogate, First>' (U+D800)
(我假设)只有在后面至少有一个代码点时才有效。
更新:@Jukka 写道:
定义“有效”。根据 Unicode 标准,私人使用代码点是有效的,它只是没有在标准中分配任何字符。代理代码点不是有效的字符数据,但可以在 UTF-16 中使用代理代码单元。Java 字符串是一系列代码单元,而不是字符;任何代码单元都可能出现在那里,但是当您将字符串作为字符处理时,它应该符合字符的 Unicode 要求。– Jukka K. Korpela
我同意定义“有效”很重要。我从FileFormat.Info站点获取了用法,该站点声明:
U+F8F8 is not a valid unicode character.
这似乎是一个相当权威的网站,所以我使用了他们的术语。也许它们有些不精确
更新:我已经尝试将@Ignacio 的 Python 转换为 Java,但失败了。我写
public void testUnicode() {
Pattern pattern = Pattern.compile("\\p{Cn}");
System.out.println("\\u0020 "+pattern.matcher("\u0020").matches());
System.out.println("A "+pattern.matcher("A").matches());
System.out.println("\\uf8f8 "+pattern.matcher("\uf8f8").matches());
}
即使对于“有效的”Unicode字符,它也统一返回false。我也找不到\p{Cn}
记录。