14

次の (例) コードの実行

import java.io.*;

public class test {
    public static void main(String[] args) throws Exception {
        byte[] buf = {-27};
        InputStream is = new ByteArrayInputStream(buf);
        BufferedReader r = new BufferedReader(
                new InputStreamReader(is, "ISO-8859-1"));
        String s = r.readLine();
        System.out.println("test.java:9 [byte] (char)" + (char)s.getBytes()[0] + 
                " (int)" + (int)s.getBytes()[0]);
        System.out.println("test.java:10 [char] (char)" + (char)s.charAt(0) + 
                " (int)" + (int)s.charAt(0));
        System.out.println("test.java:11 string below");
        System.out.println(s);
        System.out.println("test.java:13 string above");
    }
}

この出力が得られます

test.java:9 [バイト] (文字)? (整数)63
test.java:10 [文字] (文字)? (int)229
test.java:11 以下の文字列
?
上記の test.java:13 文字列

ライン 9 の出力で正しいバイト値 (-27) を保持するにはどうすればよいですか? System.out.println(s)その結果、コマンド (å)の期待される出力を受け取ります。

4

2 に答える 2

23

バイト値を保持したい場合は、理想的にはリーダーをまったく使用しないでください。任意のバイナリデータをテキストで表し、後でバイナリデータに変換するには、base16またはbase64エンコーディングを使用する必要があります。

ただし、何が起こっているのかを説明するために、デフォルトs.getBytes()の文字エンコードを使用して呼び出すと、Unicode文字U+00E5が含まれていないようです。

s.getBytes("ISO-8859-1")私の代わりにどこにでも電話をかけるとs.getBytes()、正しいバイト値が返されると思います...しかし、これをISO-8859-1に依存するのは、ちょっと汚いIMOです。

于 2010-06-15T08:47:09.543 に答える
11

前述のように、getBytes()(no-arguments) は Java プラットフォームのデフォルトのエンコーディングを使用しますが、これは ISO-8859-1 ではない可能性があります。端末とデフォルトのエンコーディングが一致し、文字をサポートしていれば、単に印刷するだけで機能します。たとえば、私のシステムでは、端末とデフォルトの Java エンコーディングはどちらも UTF-8 です。「?」が表示されているという事実。yours が一致しないか、å がサポートされていないことを示します。

システムで UTF-8 に手動でエンコードする場合は、次のようにします。

String s = r.readLine();
byte[] utf8Bytes = s.getBytes("UTF-8");

でバイト配列を与える必要があります{-61, -91}

于 2010-06-15T08:52:30.017 に答える