2011-07-08 6 views
31

文字列が有効なUTF-8形式であるかどうかを確認するにはどうすればよいですか?文字列がJavaでエンコードされた有効なUTF-8であることを確認してください

+5

あなたは[]が有効にエンコードされたバイトを意味ですか? – bestsss

+0

最も簡単なことは、デコードして再度エンコードすることです。あなたも同じことを確認してください。ほとんどの場合、これは正しいでしょう。 –

+0

@Peterは動作しません。なぜなら、いくつかの文字は異なるバイトシーケンスでエンコードされる可能性があるからです。両方のバイトのシーケンスは正確で、同じ文字をエンコードしますが、バイトは異なります。 – Jesper

答えて

31

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

バイト配列は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は、あなたがそれを検出するのに役立つライブラリです。

+4

文字列のインスタンスは、単なるサロゲートコードユニットの形で不正な形式のコードユニットシーケンスを許可するため、厳密に言えば、UTF-16エンコード形式ではありません。ただし、Unicodeの16ビット文字列です。 –

+4

さらに厳密に言うと、Java文字列は[surrogates]を含むことができるため、実際のUnicodeの16ビット文字列ではありません(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/ openjdk/6-b14/sun/nio/cs/Surrogate.java)をUCS4(3バイトおよび4バイト)文字用に使用します。 – rustyx

+0

ICU4Jは、バイト配列のエンコードを検出するのに役立つ別のJavaライブラリです。http://site.icu-project.org/ –

1

以下の投稿は、公式のJavaチュートリアル(https://docs.oracle.com/javase/tutorial/i18n/text/string.html)から取得したものです。

StringConverterプログラムは Unicode文字を含む文字列を作成することによって開始します:UTFにStringオブジェクトを変換するには

AêñüC 

:印刷された場合

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

、オリジナルの名前の文字列として表示されます-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文字は1バイトに変換され、他の文字は ペアまたは3連のバイトに変換されます。 printBytesメソッドは、ソースファイル UnicodeFormatter.javaで定義されているbyteToHexメソッドを呼び出して、バイト配列を表示します。次はprintBytesメソッドです。

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 
関連する問題