У меня есть приложение Java, которое получает данные через сокет, используя InputStreamReader
. Он сообщает «Cp1252» из своего метода getEncoding
:
/* java.net. */ Socket Sock = ...;
InputStreamReader is = new InputStreamReader(Sock.getInputStream());
System.out.println("Character encoding = " + is.getEncoding());
// Prints "Character encoding = Cp1252"
Это не обязательно соответствует тому, что система сообщает как свою кодовую страницу. Например:
C:\>chcp Active code page: 850
Приложение может получить байт 0x81, который в кодовой странице 850 представляет символ ü
. Программа интерпретирует этот байт с кодовой страницей 1252, которая не определяет ни одного символа в этом значении, поэтому вместо этого я получаю вопросительный знак.
Я смог обойти эту проблему для одного клиента, который использовал кодовую страницу 850, добавив еще один параметр командной строки в пакетный файл, запускающий приложение:
java.exe -Dfile.encoding=Cp850 ...
Но, конечно, не все мои клиенты используют кодовую страницу 850. Как заставить Java использовать кодовую страницу, совместимую с базовой системой Windows? Я бы предпочел что-то, что я мог бы просто поместить в пакетный файл, оставив код Java нетронутым:
ENC=... java.exe -Dfile.encoding=%ENC% ...