Чтение специальных символов из File - Java - PullRequest
3 голосов
/ 18 января 2012

Я читаю данные из текстового файла со следующими свойствами:

Кодировка: ANSI
Тип файла: ПК

Теперь файл содержит много специальных символов, таких как символ градуса (º) и т. Д. Я читаю этот файл, используя следующий код:

File file = new File("C:\\X\\Y\\SpecialCharacter.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));

Если кодировка файла ANSI, приведенный выше код неправильно читает специальные символы, например, e.x. строка в файле:
«Уменьшите огонь и варите, пока продукт не достигнет внутренней температуры 165ºF», reader.readLine() выдаст:
«Уменьшить огонь и варить, пока продукт не достигнет внутренней температуры 165 F»

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

Мой вопрос, в какой момент данные портятся? При хранении данных в файле или при чтении их из файла? Открытие файла в блокноте правильно отображает все специальные символы. Как это происходит?

Выход Hexdump:

          -0 -1 -2 -3  -4 -5 -6 -7  -8 -9 -A -B  -C -D -E -F

00000000- 4C 6F 77 65  72 20 68 65  61 74 20 61  6E 64 20 73 [Lower heat and s]
00000001- 69 6D 6D 65  72 20 75 6E  74 69 6C 20  70 72 6F 64 [immer until prod]
00000002- 75 63 74 20  72 65 61 63  68 65 73 20  69 6E 74 65 [uct reaches inte]
00000003- 72 6E 61 6C  20 74 65 6D  70 65 72 61  74 75 72 65 [rnal temperature]
00000004- 20 6F 66 20  31 36 35 BA  46                       [ of 165.F       ]

Ответы [ 2 ]

9 голосов
/ 18 января 2012

«ANSI» не является конкретной кодировкой - это целая коллекция кодировок. При чтении файла необходимо использовать кодировку right . Например, вполне возможно, что вы используете кодировку Windows-1252 , что означает, что вы можете захотеть попробовать передать "Cp1252" в качестве имени кодировки.

Фактически, вы передаете "UTF-8", который не является одной из кодировок, обычно называемых ANSI. Вам необходимо выяснить точную кодировку, которую использует файл, а затем указать это в параметре InputStreamReader.

Мой вопрос, в какой момент данные портятся? При хранении данных в файле или при чтении их из файла?

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

1 голос
/ 18 января 2012

new InputStreamReader(new FileInputStream(file), "UTF-8") предназначен для чтения файлов, закодированных в UFT-8: если вы читаете файл, закодированный по-другому (например, Win 1252), вам следует соответствующим образом изменить второй параметр.

Текстовый файл никогда не «запутывается» в кодировке: он хранится в некоторой кодировке, и вы должны использовать ту же кодировку при чтении, чтобы система могла интерпретировать этот сырой поток байтов и связывать каждую [группу of] byte [s] с правильным символом [или кодовой точкой Unicode, если мы делаем Unicode], чтобы вы могли видеть «правильные» глифы.

Надеюсь, это прояснит немного.

Приветствия

...