Проблема с арабским текстовым файлом в Java BufferedReader - PullRequest
3 голосов
/ 23 декабря 2010

Проблема: арабские слова в моих текстовых файлах, прочитанные Java, отображаются в виде серии вопросительных знаков: ??????

Вот код:

        File[] fileList = mainFolder.listFiles();
        BufferedReader bufferReader = null;
        Reader reader = null;


        try{

        for(File f : fileList){           
            reader = new InputStreamReader(new FileInputStream(f.getPath()), "UTF8");
            bufferReader = new BufferedReader(reader);
            String line = null;

            while((line = bufferReader.readLine())!= null){
               System.out.println(new String(line.getBytes(), "UTF-8"));
            }              

        }
        }
        catch(Exception exc){
            exc.printStackTrace();
        }

        finally {
            //Close the BufferedReader
            try {
                if (bufferReader != null)
                    bufferReader.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }

Как вы можетевидите, я указал кодировку UTF-8 в разных местах, и все же я получаю знаки вопроса, у вас есть идеи, как я могу это исправить ??

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Вместо того, чтобы пытаться распечатать строку напрямую, выведите значения Unicode для каждого символа. Например:

char[] chars = line.toCharArray();
for (int i = 0; i < chars.length; i++)
{
    System.out.println(i + ": " + chars[i] + " - " + (int) chars[i]);
}

Затем найдите соответствующие символы в кодовых таблицах Юникода .

Если вы обнаружите, что он печатает 63, то на самом деле - это вопросительные знаки ... из чего следует, что ваш текстовый файл не является действительно UTF-8 для начала.

Если, с другой стороны, для некоторых символов он печатает "?" но затем значение, отличное от 63, будет означать, что это проблема отображения консоли, и вы правильно читаете данные.

2 голосов
/ 23 декабря 2010

Заменить

System.out.println(new String(line.getBytes(), "UTF-8"));

на

System.out.println(line);

String#getBytes() без аргумента charset, а именно использует платформу по умолчанию для получения байтов из строки,который не может быть UTF-8 как таковой.Вы уже читаете байты как UTF-8 InputStreamReader, поэтому вам не нужно массировать их вперед и назад.

Далее, убедитесь, что ваша консоль дисплея (где вы читаете этилинии) поддерживает UTF-8.Например, в Eclipse это можно сделать с помощью Окно> Параметры> Общие> Рабочая область> Кодировка текстового файла> Другое> UTF-8 .

См. Также:

...