0

私は文字列を持っていて、 String hex = "6174656ec3a7c3a36f";取得したいのですString output = "atenção"が、私のテストでは String output = "aten????o"; 間違っていることしか取得できませんか?

String hex = "6174656ec3a7c3a36f";
StringBuilder output = new StringBuilder();
for (int i = 0; i < hex.length(); i+=2) {
  String str = hex.substring(i, i+2);
  output.append((char)Integer.parseInt(str, 16));
} 

System.out.println(output); //here is the output "aten????o"
4

4 に答える 4

5

16 進文字列は、ISO-8859-1 ではなく、UTF-8 文字列を示しているようです。

これが言える理由は、ISO-8859-1 の場合、1 文字あたり 2 桁の 16 進数になるからです。16 進文字列は 18 文字ですが、予想される出力は 7 文字のみです。したがって、16 進文字列は、ISO-8859-1 のように 1 文字あたり 1 バイトではなく、可変幅のエンコーディングでなければなりません。

次のプログラムは、出力を生成します。atenção

    String hex = "6174656ec3a7c3a36f";
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    for (int i = 0; i < hex.length(); i += 2) {
      String str = hex.substring(i, i + 2);
      int byteVal = Integer.parseInt(str, 16);
      baos.write(byteVal);
    } 
    String s = new String(baos.toByteArray(), Charset.forName("UTF-8"));

に変更UTF-8するとISO-8859-1、次のように表示されますatenção

于 2013-04-01T18:53:16.993 に答える