Mam aplikację Java, która odbiera dane przez gniazdo przy użyciu InputStreamReader
. donosi, że „CP1252” od sposobu jej getEncoding
:W jaki sposób określasz wartość Java file.encoding zgodną z podstawową stroną kodową systemu Windows?
/* java.net. */ Socket Sock = ...;
InputStreamReader is = new InputStreamReader(Sock.getInputStream());
System.out.println("Character encoding = " + is.getEncoding());
// Prints "Character encoding = Cp1252"
To niekoniecznie pasuje co raporty systemowe jak jego strony kodowej. Na przykład:
C:\>chcp Active code page: 850
Aplikacja może odbierać bajt 0x81, który w CP850 symbolizuje postać ü
. Program interpretuje ten bajt za pomocą strony kodowej 1252, która nie definiuje żadnego znaku o tej wartości, więc zamiast tego otrzymuję znak zapytania.
udało mi się obejść ten problem dla jednego klienta, który używany CP850 dodając innej opcji wiersza poleceń w pliku wsadowym, który uruchamia aplikację:
java.exe -Dfile.encoding=Cp850 ...
Ale nie wszyscy moi klienci korzystają z kodu strona 850, oczywiście. Jak mogę przekonać Javę do używania strony kodowej zgodnej z bazowym systemem Windows? Moje preferencje byłoby coś może po prostu umieścić w pliku wsadowym, pozostawiając kodu Java nietknięty:
ENC=... java.exe -Dfile.encoding=%ENC% ...
+1. BTW W moim systemie Windows 7 aktywna strona kodowa to 850, ale Java zgłasza "Cp1252" jako właściwość systemową "file.encoding". –
Klientów i serwera należy skonfigurować za pomocą tego samego kodowania, niezależnie od tego, co może być dla danego klienta. Aplikacja inna niż Java przesyła dane znakowe do serwera za pomocą lokalnej strony kodowej, serwer przechowuje dane, a następnie serwer wysyła je do aplikacji Java. Nikt nie przechowuje tego, co jest stroną kodową, ponieważ tak długo, jak wszyscy używali tego samego, nie miało to znaczenia. Problem polega na tym, że aplikacja Java nie współpracuje; zawsze używa Cp1252. ("Właściwym" rozwiązaniem jest zmiana protokołu, aby wymusić wszystko, na przykład, UTF-8, ale zmiana protokołu powoduje zerwanie wszystkich istniejących instalacji.) –
To brzmi jak G_A ma twoją odpowiedź. Inną opcją jest posiadanie tego raportu aplikacji innej niż java do aplikacji java, co według niej oznacza kodowanie, a następnie użycie odpowiedniego konstruktora, jak opisano powyżej. – Yishai