Чтение файлов Windows Unicode на Android - PullRequest
0 голосов
/ 02 августа 2011

Я только что узнал, что Android может правильно прочитать файл, который закодирован с использованием Windows ANSI (или так называемое многобайтовое кодирование), и преобразовать его в строки Java Unicode. Но происходит сбой при чтении файла Unicode. Похоже, что Android читает его побайтово. Строка Unicode «ABC» в файле будет считана в строку Java длиной 6, а символы будут 0x41, 0x00, 0x42, 0x00, 0x43, 0x00.

BufferedReader in = new BufferedReader(new FileReader(pathname));
String str = in.readLine();

Пожалуйста, есть ли способ правильно читать файлы Unicode Windows на Android? Спасибо.

[Изменено]

Эксперименты: я сохранил два китайских иероглифа "難 two" в двух текстовых файлах Windows:

ANSI.txt -- C3 F8 AD FE
UNICODE.txt -- FF FE E3 96 EA 54

Затем я поместил эти файлы на SD-карту Эмулятора и использовал следующую программу для их чтения: (Обратите внимание, что языковой стандарт Эмулятора уже установлен на zh_TW).

BufferedReader in = new BufferedReader(new FileReader("/sdcard/ANSI.txt"));
String szLine = in.readLine();
int n = szLine.length(), j, i;
in.close();
for (i = 0; i < n; i++) 
    j = szLine.charAt(i);

Вот что я увидел на Эмуляторе:

ANSI.txt -- FFFD FFFD FFFD
UNICODE.txt -- FFFD FFFD FFFD FFFD 0084

Apparantly Android (или Java) не может правильно декодировать китайские иероглифы. Итак, как мне это сделать? Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 02 августа 2011

FileReader, очевидно, предполагает, что кодировка будет ASCII-совместимой.(Можно ожидать UTF-8 или любое из более старых расширений ASCII).

Кроме того, это не «файл Unicode» - это «файл в кодировке UTF-16».

Выпридется использовать StreamReader и указать кодировку самостоятельно:

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(pathname), "UTF-16LE"));

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

1 голос
/ 08 мая 2012

Вы можете попробовать следующий код.
Обычно Window Ascii файл базы, который в китайских словах
может быть неправильным процессом в системе Android.

Обычно по умолчанию используется формат UTF8 в потоке Process.

Как только вы помещаете базовый файл Ascii Window, который в китайских словах, в систему Android.
обычный процесс потокане может правильно распознать часть китайского.

следующий код, может исправить строку синтаксического анализатора из текстового файла Window Base Acsii, который в китайских словах
помещается в Android System SD или папку активов.

Это очень просто, просто используйте декодер формата "BIG5" в InputStreamReader Ojbect.

Я был проверен.Работает хорошо.Попытайся !!
FYI.КНК.

String pathname="AAA.txt";
BufferedReader inBR;
inBR = new BufferedReader(new InputStreamReader(new FileInputStream(pathname), "BIG5"));
String sData="";

while ((sData  = inBR.readLine()) != null) {
    System.out.println(sData);
}
0 голосов
/ 02 августа 2011

Строка Unicode «ABC» в файле будет считываться в строку Java длиной 6, а символы будут 0x41, 0x00, 0x42, 0x00, 0x43, 0x00.

Как вы получаете длину? То, что вы описали, абсолютно верно для Java String. Строки Java - это UTF-16 (то есть Unicode). Это означает, что ABC будет храниться в строке Java в точности так, как вы описали (0x41, 0x00, 0x42, 0x00, 0x43, 0x00).

Строка 'length', однако, как возвращается int String.length(), будет равна 3, даже если она имеет длину 6 байт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...