Как вы знаете, InputStreamReader
прочитает предоставленный InputStream
и расшифрует его байты в символы.Если не указан charset
, он будет использовать кодировку по умолчанию .
Мы можем проверить эту кодировку по умолчанию с помощью java.nio.charset.Charset.defaultCharset().displayName()
.
Дело 1 .Мой CMD для Windows использует cp850
, но отчеты Java windows-1252
.Можно доказать, что введя символ ó
, System.in.read()
сообщит 162
, как и ожидалось.InputStreamReader
, однако, не сможет его декодировать, так как он ожидает выполнения windows-1252
, показывая ¢
(это 162-й windows-1252
символ).
Case 2 .В Windows мой интегрированный терминал Netbeans использует windows-1252
, но Java сообщает UTF-8
.Опять же, это может быть доказано, набрав символ ó
и System.in.read()
сообщит 243
, как и ожидалось.InputStreamReader
, однако, не сможет его декодировать, так как он ожидает выполнения UTF-8
, показывая �
(код 65533
).
Случай 3 .Моя машина Debian использует UTF-8
везде, в терминалах GNOME и Netbeans.При вводе символа ó
, System.in.read()
сообщит о двух байтах 195
и 161
, которые соответствуют представлению UTF-8
этого символа.InputStreamReader
покажет ó
, как и ожидалось.
Что я хочу? Есть ли способ правильно определить используемую кодировку фактическую , чтобы я мог читать символыиз командной строки (в Windows CMD и Netbeans в Windows) без какого-либо особого случая?
Большое спасибо.
План B : Случай 2 может быть решен изменив кодировку файлов Netbeans на UTF-8 (и он также будет обрабатывать файлы UTF-8, что IDE должна делать в 2019 году).Вариант 1 можно решить, изменив кодовую страницу на UTF-8, но я не смог заставить это работать.
Вы можете использовать следующую программу для тестирования этих случаев.Введите одни и те же символы дважды и сравните вывод.
import java.io.*;
import java.nio.charset.Charset;
public class Prova2 {
public static void main(String[] args) throws Exception {
int b;
System.out.println("Charset.defaultCharset: " + Charset.defaultCharset().displayName());
System.out.println("I will read the next bytes: ");
while ((b = System.in.read()) != '\n') {
System.out.println("I have read this byte: " + b + " (" + (char) b + ")");
}
System.out.println("I will read the next chars: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while ((b = br.read()) != '\n') {
System.out.println("I have read this char: " + b + " (" + (char) b + ")");
}
System.out.println("Thank you.");
}
}