web-dev-qa-db-ja.com

StringがJavaでエンコードされた有効なUTF-8かどうかを確認します

文字列が有効なUTF-8形式であるかどうかを確認するにはどうすればよいですか?

36
Michael Bavin

チェックできるのはバイトデータのみです。 Stringを作成した場合、すでに内部的にUTF-16になっています。

また、onlyバイト配列はUTF-8でエンコードできます。

UTF-8変換の一般的な例を次に示します。

String myString = "\u0048\u0065\u006C\u006C\u006F World";
System.out.println(myString);
byte[] myBytes = null;

try 
{
    myBytes = myString.getBytes("UTF-8");
} 
catch (UnsupportedEncodingException e)
{
    e.printStackTrace();
    System.exit(-1);
}

for (int i=0; i < myBytes.length; i++) {
    System.out.println(myBytes[i]);
}

バイト配列のエンコーディングがわからない場合、 juniversalchardet は、それを検出するのに役立つライブラリです。

34
DArkO

次の投稿は、公式のJavaで利用可能なチュートリアル: https://docs.Oracle.com/javase/tutorial/i18n/text/string.html

StringConverterプログラムは、Unicode文字を含むストリングを作成することから始まります。

String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");

印刷すると、originalという名前の文字列は次のように表示されます。

AêñüC

StringオブジェクトをUTF-8に変換するには、getBytesメソッドを呼び出して、適切なエンコード識別子をパラメーターとして指定します。 getBytesメソッドは、バイトの配列をUTF-8形式で返します。非Unicodeバイトの配列からStringオブジェクトを作成するには、encodingパラメーターを使用してStringコンストラクターを呼び出します。これらの呼び出しを行うコードは、指定されたエンコードがサポートされていない場合に備えて、tryブロックに囲まれています。

try {
    byte[] utf8Bytes = original.getBytes("UTF8");
    byte[] defaultBytes = original.getBytes();

    String roundTrip = new String(utf8Bytes, "UTF8");
    System.out.println("roundTrip = " + roundTrip);
    System.out.println();
    printBytes(utf8Bytes, "utf8Bytes");
    System.out.println();
    printBytes(defaultBytes, "defaultBytes");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

StringConverterプログラムは、utf8BytesおよびdefaultBytes配列の値を出力して、重要なポイントを示します。変換されたテキストの長さは、ソーステキストの長さと異なる場合があります。一部のUnicode文字はシングルバイトに変換され、その他の文字はペアまたはバイトのトリプレットに変換されます。 printBytesメソッドは、ソースファイルUnicodeFormatter.Javaで定義されているbyteToHexメソッドを呼び出して、バイト配列を表示します。 printBytesメソッドは次のとおりです。

public static void printBytes(byte[] array, String name) {
    for (int k = 0; k < array.length; k++) {
        System.out.println(name + "[" + k + "] = " + "0x" +
            UnicodeFormatter.byteToHex(array[k]));
    }
}

PrintBytesメソッドの出力は次のとおりです。最初と最後のバイトであるAおよびC文字のみが両方の配列で同じであることに注意してください。

utf8Bytes[0] = 0x41
utf8Bytes[1] = 0xc3
utf8Bytes[2] = 0xaa
utf8Bytes[3] = 0xc3
utf8Bytes[4] = 0xb1
utf8Bytes[5] = 0xc3
utf8Bytes[6] = 0xbc
utf8Bytes[7] = 0x43
defaultBytes[0] = 0x41
defaultBytes[1] = 0xea
defaultBytes[2] = 0xf1
defaultBytes[3] = 0xfc
defaultBytes[4] = 0x43
1