Я пытаюсь считать файл, которые содержат английский и символы 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, арабские становятся вопросительными знаками!
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-Класс удобства для чтения файлов символов. Конструкторы этого класса предполагают, что подходящая кодировка символов по умолчанию и размер байтового буфера по умолчанию. Чтобы самостоятельно указать эти значения, создайте 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
не будет работать на китайцев, и у вас снова будут подобные проблемы.
ОНО, скорее всего, считывает информацию правильно, однако ваш выходной поток, вероятно, не UTF-8, и поэтому любой символ, который не может отображаться в вашем выводе набор символов заменяется на '?'.
Вы можете подтвердить это, вынув каждый символ и распечатав порядковый номер символа.