Почему является Java BufferedReader () не чтением арабских и китайских символов правильно?

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

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

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

Когда я отлаживаю, я нашел, что считанные строки хранятся в моей Строковой переменной как следующее:

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

Выпуск 03

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

11
задан 19 revs, 3 users 96% 4 November 2014 в 14:51
поделиться

2 ответа

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

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

-121--3509662-

Грег не совсем корректен. Вы можете использовать систему, но это очень плохая идея. Вы можете использовать систему, записывая выходные данные команды во временный файл и затем считывая файл... но popen () является гораздо лучшим подходом. Например:

#include <stdlib.h>
#include <stdio.h>
void
die( char *msg ) {
    perror( msg );
    exit( EXIT_FAILURE );
}

int
main( void )
{
    size_t len;
    FILE *f;
    int c;
    char *buf;
    char *cmd = "echo foo";
    char *path = "/tmp/output"; /* Should really use mkstemp() */

    len = (size_t) snprintf( buf, 0,  "%s > %s", cmd, path ) + 1;
    buf = malloc( len );
    if( buf == NULL ) die( "malloc");
    snprintf( buf, len, "%s > %s", cmd, path );
    if( system( buf )) die( buf );
    f = fopen( path, "r" );
    if( f == NULL ) die( path );
    printf( "output of command: %s\n", buf );
    while(( c = getc( f )) != EOF )
        fputc( c, stdout );
    return EXIT_SUCCESS;
}

Есть много проблем с таким подходом... (переносимость синтаксиса для перенаправления, оставление файла в файловой системе, проблемы безопасности с другими процессами чтения временного файла и т.д.)

-121--4320925-

FileReader javadoc :

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

Итак:

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

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

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

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

24
ответ дан 3 December 2019 в 03:52
поделиться

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

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

2
ответ дан 3 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: