2010-06-15 17 views
13

Running następujący (przykład) KodJava InputStream kodowania/charset

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"); 
    } 
} 

daje mi to wyjście

 
test.java:9 [byte] (char)? (int)63 
test.java:10 [char] (char)? (int)229 
test.java:11 string below 
? 
test.java:13 string above 

Jak mogę zachować prawidłową wartość bajtów (-27) w line-9 wydruk? I w konsekwencji otrzymaj oczekiwaną moc wyjściową polecenia System.out.println(s) (å).

Odpowiedz

19

Jeśli chcesz zachować wartości bajtów, w ogóle nie korzystaj z Czytnika. Aby przedstawić dowolne dane binarne w tekście i przekonwertować je z powrotem na dane binarne później, powinieneś użyć kodowania base16 lub base64.

Jednak, aby wyjaśnić, co się dzieje, kiedy zadzwonić s.getBytes() że używa się domyślne kodowanie charakter, który najwyraźniej nie zawiera znaków Unicode U + 00E5.

Jeśli zadzwonisz s.getBytes("ISO-8859-1") wszędzie zamiast s.getBytes() Podejrzewam dostaniesz z powrotem właściwą wartość bajtu ... ale opierając się na ISO-8859-1 do tego jest trochę brudny IMO.

+0

s.getBytes ("ISO-8859-1") załatwił sprawę, dziękuję. Używałem go tylko do śledzenia miejsca, w którym czytana zawartość pliku zmieniła się w ścieżce, od czytania pliku do prezentacji danych użytkownikowi. – Tobbe

+0

@Tobbe: Cieszę się, że pomogło. W przyszłości lepiej byłoby nie przekształcić go w tekst. Chyba, że ​​to naprawdę * jest * zakodowany plik tekstowy ISO-8859-1, oczywiście. –

6

Jak podano, getBytes() (brak argumentów) używa domyślnego kodowania platformy Java, która może nie być zgodna z ISO-8859-1. Po prostu drukowanie powinno działać, pod warunkiem, że twój terminal i domyślny kodowanie pasują do siebie i wspierają postać. Na przykład w moim systemie, terminal i domyślne kodowanie Java są zarówno UTF-8. Fakt, że widzisz "?" wskazuje, że twoje nie pasują lub nie jest obsługiwane.

Jeśli chcesz ręcznie kodowania UTF-8 w systemie, wykonaj następujące czynności:

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

To powinno dać tablicę bajtów z {-61, -91}.

+0

'getBytes()' używa domyślnego kodowania platformy ** iff ** wywoływana jest wersja bezargumentowa. –