Чтение / запись .txt файла со специальными символами - PullRequest
9 голосов
/ 04 января 2011

Я открываю Блокнот (Windows) и пишу

Some lines with special characters
Special: Žđšćč

и перехожу к Сохранить как ..."someFile.txt" с Кодировкой установлен на UTF-8 .

В Java у меня есть

FileInputStream fis = new FileInputStream(new File("someFile.txt"));
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(isr);

String line;
while((line = in.readLine()) != null) {                         
    printLine(line);
}
in.close();

Но я получаю знаки вопроса и подобные "специальные" символы.Почему?

РЕДАКТИРОВАТЬ: У меня есть этот вход (одна строка в текстовом файле)

665,Žđšćč

и этот код

FileInputStream fis = new FileInputStream(new File(fileName));
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(isr);

String line;
while((line = in.readLine()) != null) {
    Toast.makeText(mContext, line, Toast.LENGTH_LONG).show();

    Pattern p = Pattern.compile(",");
    String[] article = p.split(line);

    Toast.makeText(mContext, article[0], Toast.LENGTH_LONG).show();
    Toast.makeText(mContext, Integer.parseInt(article[0]), Toast.LENGTH_LONG).show();
}
in.close();

И Toast Вывод (для тех, кто не знаком с Android, Toast - это просто способ показать всплывающее окно на экране с определенным текстом в нем).Консоль показывает «странные символы» (вероятно, из-за кодировки в окне консоли).Но он не может выполнить синтаксический анализ целого числа, потому что консоль говорит это (warning: toast output is just fine) - Проблема ?

Кажется, что строка содержит некоторые "странные" символы, которые Toast не может показать /рендер но когда я пытаюсь разобрать его, он падает.Предложения?

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

Ответы [ 6 ]

17 голосов
/ 04 января 2011

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

.

Смотри также:


Обновление в соответствии с обновленным вопросом и комментариями, очевидно, UTF-8 BOM является виновником. Блокнот по умолчанию добавляет спецификацию UTF-8 при сохранении. Похоже, что JRE на вашем HTC не проглотит это. Возможно, вы захотите использовать пример UnicodeReader, как указано в в этом ответе вместо InputStreamReader в вашем коде. Он автоматически определяет и пропускает спецификацию.

FileInputStream fis = new FileInputStream(new File(fileName));
UnicodeReader ur = new UnicodeReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(ur);

Вне зависимости от конкретной проблемы, рекомендуется закрывать ресурсы в блоке finally, чтобы обеспечить их закрытие в случае исключений.

BufferedReader reader = null;
try {
    reader = new BufferedReader(new UnicodeReader(new FileInputStream(fileName), "UTF-8"));
    // ...
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}

Кроме того, я бы предложил поместить Pattern p = Pattern.compile(","); вне цикла или даже сделать его статической константой, потому что компилировать его относительно дорого, и делать это каждый раз внутри цикла не нужно.

2 голосов
/ 04 января 2011

Ваш код выглядит правильно - но очень распространенная и простая ошибка - ошибочно принимать то, что выводится на экран, на то, что находится в строке. Проверьте с помощью отладчика, правильно ли прочитана строка.

1 голос
/ 01 марта 2012

Блокнот неправильно сохраняет специальные символы.У меня была похожая проблема, и я использовал Notepad ++ и выбрал кодировку UTf-8 оттуда.Когда я это сделал, моя программа больше не зависала при применении к ней методов библиотеки String, в отличие от того, когда я создавал текстовый файл в Блокноте.

0 голосов
/ 08 сентября 2017

Используете ли вы символ преобразования как часть запроса / ответа сервлета? Если да, request.setEncoding("UTF-8")
или
response.setCharacterEncoding("UTF-8")

должно решить вашу цель.

0 голосов
/ 05 января 2011
"Not all sequences of bytes are valid UTF-8."

См

http://en.wikipedia.org/wiki/UTF-8

в разделе "Недопустимые последовательности байтов" для конкретных деталей.

0 голосов
/ 04 января 2011

Блокнот может не обрабатывать символы, отличные от ascii.Попробуйте другой текстовый редактор.Если вы хотите придерживаться того, что доступно в установке Windows, попробуйте WordPad.

...