Я думал, что это проблема только с Python 2, но теперь я столкнулся с подобной проблемой с Java (Windows 10, JDK8).
Мои поиски пока что приводят к небольшому разрешению.
Я прочитал из входного потока 'stdin' это значение: Viļāni
. Когда я печатаю это на консоль, я получаю это: Vi????ni
.
Соответствующие фрагменты кода следующие:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
ArrayList<String> corpus = new ArrayList<String>();
String inputString = null;
while ((inputString = in.readLine()) != null) {
corpus.add(inputString);
}
String[] allCorpus = new String[corpus.size()];
allCorpus = corpus.toArray(allCorpus);
for (String line : allCorpus) {
System.out.println(line);
}
Дальнейшее расширение моей проблемы следующим образом:
Я прочитал файл, содержащий следующие 2 строки:
を
Sōten_Kōro
Когда я читаю это с диска и выводю во второй файл, я получаю следующий вывод:
ã‚’
S�ten_K�ro
Когда я читаю файл из stdin, используя cat testinput.txt | java UTF8Tester
, я получаю следующий вывод:
???
S??ten_K??ro
Оба явно неправы. Мне нужно иметь возможность печатать правильные символы для консоли и файла. Мой пример кода выглядит следующим образом:
public class UTF8Tester {
public static void main(String args[]) throws Exception {
BufferedReader stdinReader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
String[] stdinData = readLines(stdinReader);
printToFile(stdinData, "stdin_out.txt");
BufferedReader fileReader = new BufferedReader(new FileReader("testinput.txt"));
String[] fileData = readLines(fileReader);
printToFile(fileData, "file_out.txt");
}
private static void printToFile(String[] data, String fileName)
throws FileNotFoundException, UnsupportedEncodingException {
PrintWriter writer = new PrintWriter(fileName, "UTF-8");
for (String line : data) {
writer.println(line);
}
writer.close();
}
private static String[] readLines(BufferedReader reader) throws IOException {
ArrayList<String> corpus = new ArrayList<String>();
String inputString = null;
while ((inputString = reader.readLine()) != null) {
corpus.add(inputString);
}
String[] allCorpus = new String[corpus.size()];
return corpus.toArray(allCorpus);
}
}
Действительно застрял здесь, и помощь будет очень признательна! Заранее спасибо. Пол