2012-02-29 3 views
1

Я пишу программу, которая ищет слова в текстовом файле (скажем B) в другом текстовом файле словаря (например, A), чтобы сравнить эффективность различных алгоритмов сортировки.Java - Невозможно прочитать специальные символы из текстового файла

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

Моя программа выходит из строя, когда встречает линию со специальным символом. В частности, в момент, когда это слово сравнивается со словом в другом текстовом файле словаря, используя метод compareTo. Он выходит из строя с помощью NullPointerException.

Я напечатал специальный символ, чтобы увидеть, что «μ» представляется как «Âμ», и странные символы всегда присутствуют на первой строке («ï» ¿»).

Я использую сканер для ввода имени файла:

inputStream = new Scanner (new FileInputStream(args[0])); 

Я попробовал FileReader, а

В общем, как бы я читал специальные символы или слова, содержащие специальные символы? И будут ли эти персонажи совместимы со встроенным методом compareTo или мне придется найти другой способ их заказа?

+0

Я думаю, что вы показываете слишком мало кода. (arg [0] выглядит как параметр для «public static void main (String [] args)» для меня. Вы вызываете свою программу с параметром?) –

+0

yes, args [0] - это имя файла – user929404

ответ

4

Нет кодировки ANSI, существует только ASCII. Используйте Notepad ++ для создания правильных кодированных файлов UTF-8. Откройте файл на Java с помощью reader, который принимает кодировку.

+0

Эта программа для тестирования «с использованием любого входа» в соответствии с рынками. Я не могу контролировать, как они сохраняют текстовый файл. Меня просто беспокоит, что произойдет, если они решат поставить специальный символ во входном текстовом файле. Но в целом, как мне читать специальные символы – user929404

+0

Вы не можете, если не знаете кодировку. Все, что вы можете сделать, это использовать ICU4J для угадывания кодировки. Все остальное ** будет терпеть неудачу. –

+0

Вы были правы насчет Notepad ++. Я создал текстовый файл с помощью Notepad ++, и программа больше не сработала. Однако теперь эти символы отображаются как «?». Я использую jGrasp, если его использовать – user929404

2

ли

inputStream = new Scanner(new FileInputStream(args[0]), "UTF-8"); 

или

BufferedReader in = new BufferedReader(
     new InputStreamReader(new FileInputStream(args[0]), "UTF-8")); 

InputStreams являются для двоичных данных байт, Читатели находятся на персонажей с их кодированием.

Кажется, перед текстом есть символ «BOM», пространство с нулевой шириной, которое служит для обозначения текста как UTF-8. Это можно было бы удалить, но тогда Windows не распознает UTF-8. В сканере вы можете пропустить его.

+0

Я попытался создать сканер, как вы сказали, однако, у меня все еще такая же ошибка, как раньше – user929404

+0

Это распространенное заблуждение относительно добавления спецификации в кодированные файлы UTF-8. Спецификация здесь [обескуражена] (http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8) becaue UTF-8 является агностиком байтового порядка. Java не будет добавлять спецификацию по умолчанию. –

+0

Я также попробовал BufferedReader и по-прежнему получал ту же ошибку в словаре строк [position] .compareTo (searchTerm) <0, где searchTerm - это строка со специальным символом. Эта программа работает для ввода нестандартного символа – user929404

Смежные вопросы