Отображение специальных символов

#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 и укажите кодировку вывода.