Чтение файла и запись файла с символами UTF-8 (другой язык)

У меня есть файл, который имеет символы, такие как: «Joh 1: 1 ஆதியிலே வாரவாரதததை இருநஇருநதது, அநஅநத வாரவாரதததை தேவனிடததேவனிடததிலிருநதிலிருநதது, அநஅநத வாரவாரதததை தேவனாயிருநதேவனாயிருநதது».

www.unicode.org/charts/PDF/U0B80.pdf

Когда я использую следующий код:

bufferedWriter = new BufferedWriter (new OutputStreamWriter(System.out, "UTF8"));

Вывод — прямоугольники и другие странные символы, подобные этому:

"�P�^����O֛���;�<�aYՠ؛"

Кто-нибудь может помочь?

это полные коды:

File f=new File("E:\\bible.docx");
        Reader decoded=new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8);
        bufferedWriter = new BufferedWriter (new OutputStreamWriter(System.out, StandardCharsets.UTF_8));
        char[] buffer = new char[1024];
        int n;
        StringBuilder build=new StringBuilder();
        while(true){
            n=decoded.read(buffer);
            if(n<0){break;}
            build.append(buffer,0,n);
            bufferedWriter.write(buffer);
        }

введите здесь описание изображения

Значение StringBuilder показывает символы UTF, но при отображении в окне оно отображается в виде прямоугольников.

Найден ответ на проблему!!! Кодировка правильная (т.е. UTF-8) Java читает файл как UTF-8, а строковые символы - UTF-8. Проблема в том, что нет шрифта для его отображения на панели вывода netbeans. После изменения шрифта для панели вывода (Netbeans->tools->options->misc->вкладка вывода) я получил ожидаемый результат. То же самое относится, когда он отображается в JTextArea (шрифт необходимо изменить). Но мы не можем изменить шрифт командной строки Windows.


person Alfa    schedule 01.08.2013    source источник
comment
Как вы читаете файл? у вас есть код, который вы используете для чтения?   -  person morgano    schedule 01.08.2013
comment
Вы предоставляете имя набора символов в виде строкового литерала. Имя, согласно документации, UTF-8.   -  person Zec    schedule 01.08.2013
comment
Проверьте в отладчике, что строки содержат ожидаемые символы Unicode. Затем убедитесь, что используемое вами устройство вывода поддерживает UTF8.   -  person Thorbjørn Ravn Andersen    schedule 01.08.2013
comment
Покажите код, где вы читаете данные.   -  person erickson    schedule 01.08.2013
comment
Чтобы прочитать docx файл, вам нужен docx ридер. Вы не можете прочитать его, как если бы это был обычный текст. Проблема не в языке, а в формате файла.   -  person Peter Lawrey    schedule 01.08.2013
comment
Нашел ответ на проблему; Кодировка правильная (т.е. UTF-8)   -  person Alfa    schedule 06.08.2013


Ответы (3)


Поскольку ваш вывод закодирован в UTF-8, но по-прежнему содержит символ замены (U+FFFD, �), я полагаю, что проблема возникает при чтении данных.

Убедитесь, что вы знаете, какую кодировку использует ваш входной поток, и установите кодировку для InputStreamReader соответственно. Если это тамильский, я бы предположил, что это UTF-8. Я не знаю, поддерживает ли Java TACE-16. Это будет выглядеть примерно так

StringBuilder buffer = new StringBuilder();
try (InputStream encoded = ...) {
  Reader decoded = new InputStreamReader(encoded, StandardCharsets.UTF_8);
  char[] buffer = new char[1024];
  while (true) {
    int n = decoded.read(buffer);
    if (n < 0)
      break;
    buffer.append(buffer, 0, n);
  }
}
String verse = buffer.toString();
person erickson    schedule 01.08.2013
comment
@Zec Если вы имеете в виду UTF8 вместо UTF-8, нет. UTF8 — это псевдоним кодировки UTF-8. Если кодировка не найдена, большинство API выдаст ошибку UnsupportedEncodingException. - person erickson; 01.08.2013
comment
Понятно. Спасибо. В любом случае, я не обязан отвечать на вопросы по Java. - person Zec; 01.08.2013
comment
Файл f=новый файл(E:\\bible.docx); Читатель декодирован = новый InputStreamReader (новый FileInputStream (f), StandardCharsets.UTF_8); bufferedWriter = новый BufferedWriter (новый OutputStreamWriter (System.out, StandardCharsets.UTF_8)); буфер char[] = новый char[1024]; инт н; Сборка StringBuilder=новый StringBuilder(); в то время как (истина) { n = decoded.read (буфер); if(n‹0){break;} build.append(buffer,0,n); bufferedWriter.write(буфер); } - person Alfa; 01.08.2013
comment
@Alfa Самый простой способ проверить правильность входного декодирования - просмотреть декодированные символы в памяти с помощью отладчика. Если вы не знакомы с отладчиком, вы можете напечатать числовое значение некоторых символов. Они должны быть в диапазоне 0x0B80-0x0BFF. - person erickson; 01.08.2013
comment
Кроме того, вы уверены, что ввод закодирован в UTF-8? Это было предположение с моей стороны. Я не знаком с кодировками, используемыми для тамильского языка. Является ли документ на самом деле XML-форматом Microsoft Word? Если да, то какая кодировка указана в XML? - person erickson; 01.08.2013
comment
массив char содержит символы UTF, - person Alfa; 01.08.2013
comment
Я могу точно скопировать из входного файла в выходной файл. Но я не могу отображать символы в системном потоке (System.out), используя как NetBeans, так и командную строку. Я не знаю, да? - person Alfa; 01.08.2013
comment
Если это так, то, вероятно, это были просто настройки вашей консоли. - person erickson; 01.08.2013

System.out слишком близок к операционной системе, чтобы быть достаточно универсальным. В вашем случае консоль NetBeans, вероятно, использует кодировку операционной системы, а шрифт, выбранный IDE.

Сначала запишите в файл. Если вы сделаете его HTML, вы можете даже дважды щелкнуть его и указать внутреннюю правильную кодировку. Тогда используйте «UTF-8», поскольку «UTF8» специфичен для Java («UTF-8» также может использоваться в Java). Может быть, с JDesktop.getDesktop().open("... .html");.

Небольшой JFrame с JTextPane тоже подойдет.

person Joop Eggen    schedule 01.08.2013

Оказывается, тамильский кодируется 16 битами, так что просто используйте UTF-16 вместо UTF-8. Сделав это, я смог напечатать текст на тамильском языке в консоли Eclipse.

person Mohammed Muzzamil    schedule 24.11.2015