我想要一個算法或庫,可以指示一個Unicode點是否有效。例如U+F8F8
似乎不是一個有效的Unicode字符,但被描述爲"PRIVATE_USE_AREA"
。我找到了ICU - 這是一個很好/最好的解決方案嗎?如何確定一個Unicode字符是否有效
UPDATE:@再編程的建議(下)是使用:
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)
其是(I假定)僅當隨後在至少一個或多個碼點有效
UPDATE:@Jukka寫道:
定義「有效的」 A私人用途。代碼點根據Unicode 標準有效,它在 標準中沒有任何字符分配。代理代碼點不是有效的字符數據,但 替代代碼單元可用於UTF-16。 Java字符串是代碼單元的一個 序列,而不是字符;任何代碼單元可能在那裏出現 ,但是當您處理字符串作爲字符,它應該符合 Unicode字符的要求。 - Jukka K. Korpela
我同意定義「有效」很重要。我把從FileFormat.Info網站宣告用法:
U+F8F8 is not a valid unicode character.
這似乎是一個相當權威的網站,所以我用自己的任期。也許他們有些不準確
更新: 我已經嘗試@伊格納西奧的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 http://icu-project.org/apiref/icu4j/com/ibm/icu/charset/CharsetCallback.Decoder.html? – reprogrammer
定義「有效」。私人使用代碼點根據Unicode標準是有效的,它在標準中沒有任何字符分配給它。代理*代碼點*不是有效的字符數據,但代理*代碼單元*可以在UTF-16中使用。 Java字符串是一系列代碼單元,而不是字符;任何代碼單元都可能出現在那裏,但是當您將字符串作爲字符處理時,它應該符合Unicode對字符的要求。 –
@Jukka這是非常有用的。已將其複製到文本中。 –