Кодирование/кодировка Java InputStream
Запуск следующего (примерного) кода
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)
(å).
Ответы
Ответ 1
Если вы хотите сохранить значения байта, не используйте Reader вообще. Чтобы представить произвольные двоичные данные в тексте и преобразовать их обратно в двоичные данные позже, вы должны использовать кодировку base16 или base64.
Однако, чтобы объяснить, что происходит, когда вы вызываете s.getBytes()
, используя стандартную кодировку символов, которая, по-видимому, не включает символ Unicode U + 00E5.
Если вы вызываете s.getBytes("ISO-8859-1")
везде, а не s.getBytes()
, я подозреваю, что вы вернете правое значение байта... но полагаясь на ISO-8859-1, для этого есть некоторая грязная IMO.
Ответ 2
Как отмечалось, getBytes()
(без аргументов) использует стандартную кодировку платформы Java, которая может быть не ISO-8859-1. Просто печать должна работать, если ваш терминал и кодировка по умолчанию совпадают и поддерживают символ. Например, в моей системе конечная и стандартная Java-кодировка являются UTF-8. Тот факт, что вы видите '?' указывает, что ваш не соответствует, или å не поддерживается.
Если вы хотите вручную кодировать UTF-8 в своей системе, выполните следующие действия:
String s = r.readLine();
byte[] utf8Bytes = s.getBytes("UTF-8");
Он должен дать массив байтов с {-61, -91}
.