文字列が有効なUTF-8形式であるかどうかを確認するにはどうすればよいですか?
チェックできるのはバイトデータのみです。 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 は、それを検出するのに役立つライブラリです。
次の投稿は、公式の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