【发布时间】:2012-11-27 12:07:11
【问题描述】:
我想要一个可以指示 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} 记录。
【问题讨论】:
-
你试过CharsetCallback.Decoder icu-project.org/apiref/icu4j/com/ibm/icu/charset/…吗?
-
定义“有效”。根据 Unicode 标准,私人使用代码点是有效的,它只是没有在标准中分配任何字符。代理 code point 不是有效的字符数据,但代理 code units 可以在 UTF-16 中使用。 Java 字符串是一系列代码单元,而不是字符;任何代码单元都可能出现在那里,但是当您将字符串作为字符处理时,它应该符合字符的 Unicode 要求。
-
@Jukka 这非常有用。已将其复制到文本中。
标签: java unicode internationalization icu