私は少し驚いたことに走りました。適切な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)ため
Javadoc:_ "このメソッドは、不正な入力文字列およびマップ不可能文字列をこの文字セットのデフォルトの置換文字列で置き換えます。デコード処理をさらに制御する必要がある場合は、CharsetDecoderクラスを使用する必要があります。 –
はい、そうだと思います。まだ私には明らかではありません_それは実装です。好きなとき...これはいつ役に立つの?これは、私が期待していることをしておらず、それについて私に教えていないということです。 –