4

のインスタンスがありますjava.lang.CharSequenceこのインスタンスがUnicode スカラー値のシーケンスであるかどうか (つまり、インスタンスが UTF-16 エンコード形式であるかどうか) を判断する必要があります。の保証にもかかわらず、java.lang.StringJava 文字列は必ずしも UTF-16 エンコーディング形式であるとは限りません (少なくとも最新のUnicode 仕様、現在は 6.2によるとは限りません) 。(ただし、Java 文字列はUnicode 16 ビット文字列です。)

これには、次のようないくつかの明白な方法があります。

  1. シーケンスのコード ポイントを反復処理し、それぞれを Unicode スカラー値として明示的に検証します。
  2. 正規表現を使用して、孤立したサロゲート コード ポイントを検索します。
  3. エンコード エラーを報告する文字セット エンコーダーを介して文字シーケンスをパイプ処理します。

ただし、このようなものはライブラリ関数として既に存在するはずです。標準APIで見つけることができません。私はそれを見逃していますか、それとも実装する必要がありますか?

4

1 に答える 1

1

try this func

static boolean isValidUTF16(String s) {
    for (int i = 0; i < s.length(); i++) {
        if (Character.isLowSurrogate(s.charAt(i)) && (i == 0 || !Character.isHighSurrogate(s.charAt(i - 1)))
                || Character.isHighSurrogate(s.charAt(i)) && (i == s.length() -1 || !Character.isLowSurrogate(s.charAt(i + 1)))) {
            return false;
        }
    }
    return true;
}

here's a test

public static void main(String args[]) {
    System.out.println(isValidUTF16("\uDC00\uDBFF"));
    System.out.println(isValidUTF16("\uDBFF\uDC00"));
}
于 2013-04-04T11:05:57.047 に答える