2009-05-07 23 views
3

私は何かをデバッグしようとしているし、次のコードは、これまで真空でないUTF-8バイト配列から空のJava文字列を作成できますか?

public boolean impossible(byte[] myBytes) { 
    if (myBytes.length == 0) 
    return false; 
    String string = new String(myBytes, "UTF-8"); 
    return string.length() == 0; 
} 

を返すことができる場合、私は思ったんだけど、私はそれを渡すことができますいくつかの値がtrueを返しますありますか?私は2バイトのシーケンスの最初のバイトだけを渡すことで手抜きをしましたが、それでも1つの文字列が生成されます。

これを明らかにするために、GCJでコンパイルされたJava 1.4コードのPowerPCチップで、ネイティブのバイナリ実行可能ファイルが作成されました。これは、基本的に、ほとんどのベットがオフであることを意味します。私は、Javaの「通常の」振る舞い、あるいはJavaの仕様が何か約束をしたのかどうか、ほとんど疑問に思います。

答えて

0

UTF-8は、可変長符号化方式であり、ほとんどの「通常」文字は1バイトです。だから任意の空でないバイト[]は常に文字列に変換され、私は思っていただろう。

再生したい場合は、可能なすべてのバイト値を繰り返し処理し、その値の単一値配列を渡し、その文字列が空でないことを宣言する単体テストを作成します。

1

おそらく。

Java 5 API docsから「指定されたバイトが指定された文字セットで有効でない場合のこのコンストラクタの動作は不定です。

私はそれがに依存していることを推測:ドキュメントが指定されていない「と言ったら、あなたのJVM(日、HP、IBM、オープンソース1、など)

を書いたベンダー を使用されているJavaのバージョン 「すべてのベットは

編集オフになっている:Trey によってそれに打たJavaは(私は、彼らはまだそれを固定しているかどうかわからないんだけど、これは)正しくBOM markを処理する場合CharsetDecoder

1

を使用してについての彼のアドバイスを取り、その後、それは可能なはずですinpu t BOM(U + FEFF、UTF-8のバイトシーケンスEF BB BF)を持つバイト配列。空の文字列を取得します。


更新:

私は1-3バイトの全ての値とそのメソッドをテストしました。それらの誰もJava 1.6で空文字列を返しませんでした。ここでは、私は別のバイト配列の長さで使用したテストコードです:

public static void main(String[] args) throws UnsupportedEncodingException { 
    byte[] test = new byte[3]; 
    byte[] end = new byte[test.length]; 

    if (impossible(test)) { 
     System.out.println(Arrays.toString(test)); 
    } 
    do { 
     increment(test, 0); 
     if (impossible(test)) { 
      System.out.println(Arrays.toString(test)); 
     } 
    } while (!Arrays.equals(test, end)); 

} 

private static void increment(byte[] arr, int i) { 
    arr[i]++; 
    if (arr[i] == 0 && i + 1 < arr.length) { 
     increment(arr, i + 1); 
    } 
} 

public static boolean impossible(byte[] myBytes) throws UnsupportedEncodingException { 
    if (myBytes.length == 0) { 
     return false; 
    } 
    String string = new String(myBytes, "UTF-8"); 
    return string.length() == 0; 
} 
+0

残念ながら、JavaはUTF-8 BOMを正しく処理しません。それはまったく扱いません。それをコンテンツの一部として扱うだけです –

関連する問題