Почему Java BufferedReader () неправильно читает арабские и китайские символы? - PullRequest
11 голосов
/ 14 февраля 2010

Я пытаюсь прочитать файл, содержащий английские и арабские символы в каждой строке и другой файл, содержащий английские и китайские символы в каждой строке. Однако символы арабского и китайского языков не отображаются правильно - они просто отображаются в виде вопросительных знаков. Любая идея, как я могу решить эту проблему?

Вот код, который я использую для чтения:

try {
        String sCurrentLine;
        BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile));
        int counter = 0;

        while ((sCurrentLine = br.readLine()) != null) {
            String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine);
            System.out.println("The line number "+ counter
                               + " contain : " + sCurrentLine);
            counter++;
        }
    }

Издание 01

После прочтения строки и получения арабского и китайского слова я использую функцию для их перевода путем простого поиска Заданного арабского текста в ArrayList (который содержит все ожидаемые слова) (используя indexOf (); метод). Затем, когда индекс слова найден, он используется для вызова английского слова с таким же индексом в другом Arraylist. Однако этот поиск всегда возвращает false, потому что он не выполняется при поиске знаков вопроса вместо арабских и китайских символов. Таким образом, мой отпечаток System.out.println показывает мне пустые значения, по одному на каждую ошибку перевода.

* Я использую IDE Netbeans 6.8 для Mac версии


Издание 02

Вот код, который ищет перевод:

        int testColor = dbColorArb.indexOf(wordToTranslate);
        int testBrand = -1;
        if ( testColor != -1 ) {
            String result = (String)dbColorEng.get(testColor);
            return result;
        } else {
            testBrand = dbBrandArb.indexOf(wordToTranslate);
        }
        //System.out.println ("The testBrand is : " + testBrand);
        if ( testBrand != -1 ) {
            String result = (String)dbBrandEng.get(testBrand);
            return result;
        } else {
            //System.out.println ("The first null");
            return null;
        }

Я на самом деле ищу 2 Arraylists, которые могут содержать желаемое слово для перевода. Если не удается найти их в обоих списках ArrayLists, возвращается ноль.


Издание 03

При отладке я обнаружил, что читаемые строки хранятся в моей переменной String следующим образом:

 "3;0000000000;0000001001;1996-06-22;;2010-01-27;����;;01989;������;"

Издание 03

Файл, который я читаю, был передан мне после того, как он был изменен другой программой (о которой я ничего не знаю, кроме того, что он создан в VB), программа создала арабские буквы, которые появляются неправильно. Когда я проверил кодировку файла в Notepad ++, он показал, что это ANSI. однако, когда я конвертирую его в UTF8 (который заменил арабскую букву на другую английскую букву), а затем преобразовываю ее обратно в ANSI, арабский становится вопросительными знаками!

Ответы [ 3 ]

24 голосов
/ 14 февраля 2010

FileReader Javadoc :

Удобный класс для чтения символьных файлов. Конструкторы этого класса предполагают, что кодировка символов по умолчанию и размер байтового буфера по умолчанию являются подходящими. Чтобы указать эти значения самостоятельно, создайте InputStreamReader для FileInputStream.

Итак:

Reader reader = new InputStreamReader(new FileInputStream(fileName), "utf-8");
BufferedReader br = new BufferedReader(reader);

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

Обновление: В приведенном выше коде заменить utf-8 на cp1256. Это прекрасно работает для меня (WinXP, JDK6)

Но я бы порекомендовал вам настаивать на том, чтобы файл генерировался с использованием UTF-8. Потому что cp1256 не будет работать для китайцев, и у вас снова будут похожие проблемы.

2 голосов
/ 14 февраля 2010

ИТ, скорее всего, правильно читает информацию, однако ваш выходной поток, вероятно, не UTF-8, и поэтому любой символ, который не может быть отображен в вашем выходном наборе символов, заменяется на «?».

Вы можете подтвердить это, вытащив каждый символ и напечатав порядковый номер символа.

0 голосов
/ 12 октября 2010
public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
...