Java InputStream кодировка / кодировка - PullRequest
13 голосов
/ 15 июня 2010

Выполнение следующего (примера) кода

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 [byte] (char)? (int)63
test.java:10 [char] (char)? (int)229
test.java:11 string below
?
test.java:13 string above

Как сохранить правильное значение байта (-27) в распечатке строки 9? И, следовательно, получить ожидаемый результат команды System.out.println(s) (å).

Ответы [ 2 ]

20 голосов
/ 15 июня 2010

Если вы хотите сохранить значения byte , не используйте Reader вообще, в идеале. Чтобы представить произвольные двоичные данные в тексте и позже преобразовать их в двоичные данные, следует использовать кодировку base16 или base64.

Однако, чтобы объяснить, что происходит, когда вы звоните s.getBytes(), который использует кодировку по умолчанию , которая, очевидно, не включает в себя символ Unicode U + 00E5.

Если вы звоните s.getBytes("ISO-8859-1") везде вместо s.getBytes() Я подозреваю, что вы вернете правильное значение байта ... но полагаться на ISO-8859-1 для этого довольно грязно IMO.

7 голосов
/ 15 июня 2010

Как отмечалось, getBytes() (без аргументов) использует кодировку по умолчанию для платформы Java, которая может не соответствовать ISO-8859-1.Простая печать должна работать при условии, что ваш терминал и кодировка по умолчанию соответствуют друг другу и поддерживают символ.Например, в моей системе терминал и кодировка Java по умолчанию - UTF-8.Тот факт, что вы видите '?'означает, что ваш не совпадает или å не поддерживается.

Если вы хотите вручную кодировать в UTF-8 в вашей системе, выполните:с {-61, -91}.

...