2010-06-15 3 views
13

Запуск следующее (пример) код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) (å).

ответ

19

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

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

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

+0

s.getBytes («ISO-8859-1») сделал трюк, спасибо. Я использовал его только для отслеживания, когда содержимое файла, которое я читал, изменилось по пути от чтения файла до представления данных пользователю. – Tobbe

+0

@Tobbe: Рад, что это помогло. Было бы лучше не преобразовывать его в текст вообще, но в будущем. Разумеется, если это действительно * есть * текстовый файл с ISO-8859-1. –

6

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

Если вы хотите вручную кодировать UTF-8 в вашей системе, сделайте следующее:

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

Это должно дать байтовый массив с {-61, -91}.

+0

'getBytes()' использует кодировку по умолчанию для платформы **, если ** вызывается версия без аргументов. –