2016-10-10 5 views
0

私は少し驚いたことに走りました。適切なutf-8ではないバイトから文字列を作成しようとすると、Stringコンストラクタが結果を返します。例外はスローされません。例:Java文字列コンストラクタがでエラーを無視するようであることをjava.lang.Stringはどのようにエンコードを検証しないのですか?

>>> '\xf0\xab'.decode('utf-8') 
    Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode 
     return codecs.utf_8_decode(input, errors, True) 
    UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: unexpected end of data 

、なぜそれがある:やや明確なエラーメッセージを表示して、例のPythonは、エラーを与えるためで同じことをしようと

byte[] x = { (byte) 0xf0, (byte) 0xab }; 
new String(x, "UTF-8"); // This works, or at least gives a result 

// This however, throws java.nio.charset.MalformedInputException: Input length = 3 
ByteBuffer wrapped = ByteBuffer.wrap(x); 
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); 
decoder.decode(wrapped); 

入力?

更新:もう少し明確にする必要があります。 javadocはこれが不特定であることを指摘します。しかし、これをこのように実装する理由は何でしょうか?このような振る舞いは決して望んでいないようで、CharsetDecoderを安全に使うために必要なソースを100%確かめることができないときはいつでもそうです。 String(byte[], String)ため

+2

Javadoc:_ "このメソッドは、不正な入力文字列およびマップ不可能文字列をこの文字セットのデフォルトの置換文字列で置き換えます。デコード処理をさらに制御する必要がある場合は、CharsetDecoderクラスを使用する必要があります。 –

+0

はい、そうだと思います。まだ私には明らかではありません_それは実装です。好きなとき...これはいつ役に立つの?これは、私が期待していることをしておらず、それについて私に教えていないということです。 –

答えて

1

Javaドキュメントは言う:

このコンストラクタの動作は、与えられたバイトが与えられた文字セットが不定ある に有効でないとき。デコード処理をさらに制御する必要がある場合は、CharsetDecoderクラスを にする必要があります。

さらに別の動作を持っていString(byte[], Charset)ジーコンストラクタ:

このメソッドは常には、不正入力と、この文字セットのデフォルトの置換文字列とマップ不可文字 列を置き換えます。 デコード処理をさらに制御する必要がある場合は、CharsetDecoderクラスを使用する必要があります。

私はフィヨンの行動がより好きです。しかし、JavaがまさにPythonに似ているとは期待できません。

+0

私は実際にString(byte []、String)とString(byte []、Charset)の違いに気づいていませんでした。それはそれをさらに見知らぬものにしてくれると私は思う。 :) –

関連する問題