У меня есть приложение 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 <b>-Dfile.encoding=Cp850</b> ...
Но не все мои клиенты, конечно, используют кодовую страницу 850. Как я могу заставить Java использовать кодовую страницу, которая совместима с базовой системой Windows? Я бы предпочел что-то, что я мог бы просто поместить в командный файл, оставив нетронутым код Java:
ENC=...
java.exe -Dfile.encoding=%ENC% ...