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)
、少なくとも 1 つ以上のコード ポイントが続く場合にのみ有効である (と私が推測する) などのポイントが含まれます。
更新: @Jukka は次のように書いています。
「有効」を定義します。Private Use コード ポイントは Unicode 標準に従って有効ですが、標準で割り当てられた文字がありません。サロゲート コード ポイントは有効な文字データではありませんが、サロゲート コード単位は UTF-16 で使用できます。Java 文字列は、文字ではなく一連のコード単位です。そこには任意のコード単位が表示されますが、文字列を文字として処理する場合は、文字に関する Unicode 要件に準拠する必要があります。– ユッカ・K・コルペラ
「有効」を定義することが重要であることに同意します。私は次のように宣言した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}
た。