1

コンストラクターを介して、ランダムなバイナリ データを含む byte[] を String に変換することは 100% 安全 (例外/エラーなし) ですか?

new String(bytes);
// -- or --
new String(bytes,"UTF-8");  // Or other charset

私の懸念は、無効な UTF-8 バイトが原因で、メッセージが部分的に文字化けするのではなく、例外やその他の障害が発生するかどうかです。

期待どおりに動作するように見えるため、既知の不良バイト値をいくつか試しました。例えば:

byte[] bytes = new byte[] {'a','b','c',(byte)0xfe,(byte)0xfe,(byte)0xff,(byte)0xff,'d','e','f'};

String test = new String(bytes,"UTF-8");

System.out.println(test);

「abc????def」を出力します。

私の懸念は、すべての無効な組み合わせをテストできるとは保証できないため、他の特定の組み合わせが他の予期しない方法で失敗する可能性があるかどうかです。

4

2 に答える 2

4

これはドキュメントでカバーされています:

このメソッドは、常に不正な形式の入力およびマップ不可能な文字シーケンスをこの文字セットのデフォルトの置換文字列に置き換えます

常にUTF-8を使用しているとは限らない場合、失敗する1つのことは、UnsupportedEncodingExceptionをスローする可能性があることです。

于 2012-08-28T22:06:25.950 に答える
4

不正な入力でのデコード動作をいじりたい場合は、次のようなものを使用します

StandardCharsets.UTF_8
  .newDecoder()
  .implOnMalformedInput(CodingErrorAction.REPORT)
  .implOnUnmappableCharacter(CodingErrorAction.REPLACE)
  .implReplaceWith(replacementString)
  .decode(ByteBuffer.wrap(byteArray))
  .toString();

これにより、関連するさまざまなノブをすべていじることができます。

于 2012-08-28T22:55:29.583 に答える