#java #unicode
#java #юникод
Вопрос:
Я сталкиваюсь с проблемами при отображении специальных символов на консоли Windows.
Я написал следующий код:
public static void main(String[] args) throws IOException {
File newFile = new File("sampleInput.txt");
File newOutFile = new File("sampleOutput.txt");
FileReader read = new FileReader(newFile);
FileWriter write = new FileWriter(newOutFile);
PushbackReader reader = new PushbackReader(read);
int c;
while ((c = reader.read()) != -1)
{
write.write(c);
}
read.close();
write.close();
}
Выходной файл выглядит точно так же, как и входной файл, содержащий специальные символы. т. Е. Для содержимого во входном файле © Ø ŻƩ abcdefĦ
выходной файл содержит точно такое же содержимое. Но когда я добавляю строку System.out.printf("%c", (char) c)
, содержимое на консоли выглядит следующим образом: ÿþ©
(содержит больше символов, но я не могу скопировать вставку здесь). Я читал, что проблема может быть связана с набором символов консоли Windows, но не смог найти для этого исправления.
Учитывая, что в будущем среда вывода может быть любой, я не хочу сталкиваться с проблемами с отображением символов Unicode для любого типа out
потока.
Может кто-нибудь, пожалуйста, помочь мне разобраться в проблеме и как я могу это исправить?
Ответ №1:
Reader
И Writer
будет использовать кодировку платформы по умолчанию для преобразования символов в байты. В вашей среде это, по-видимому, не совместимая с Unicode кодировка, такая как UTF-8.
Вам нужно InputStreamReader
и OutputStreamWriter
в котором вы можете явно указать кодировку.
Reader read = new InputStreamReader(new FileInputStream(newFile), "UTF-8"));
Writer write = new OutputStreamWriter(new FileOutputStream(newOutFile), "UTF-8"));
// ...
Кроме того, консоль должна быть настроена на использование UTF-8 для отображения символов. Например, в Eclipse вы можете сделать это с помощью Window> Preferences> General> Workspace> Кодировка текстового файла.
В консоли командной строки невозможно отобразить эти символы из-за отсутствия шрифта, поддерживающего эти символы. Вы хотели бы перейти к консольному подходу пользовательского интерфейса, подобному Swing.
Смотрите также:
Комментарии:
1. Спасибо, БалусК, но внесение ваших изменений также испортило мое содержимое в выходной файл, записанный в него. Я изменил набор символов в Eclipse, и все равно содержимое не отображается как то же самое во входном файле. Чего мне не хватает?
2. Тогда исходный файл, по-видимому, не был сохранен в UTF-8.
3. Ну, я делал это раньше. Возможно, именно поэтому он показал точно такое же содержимое, не испортив его.
4. Извините, вы правы. Входной файл был в формате Unicode, а не UTF-8.
5. UTF-8 — это разновидность формата unicode. Вы имеете в виду, что входной файл был сохранен как UTF-16?
Ответ №2:
Вместо FileWriter попробуйте использовать OutputStreamWriter и укажите кодировку вывода.