2012-01-18 2 views
3

Я чтение данных из текстового файла со следующими свойствами:Чтение специальных символов из файла - Java

Encoding: ANSI
Тип файла: PC

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

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

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

Когда я изменил кодировка для файла в 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  ] 
+0

Пожалуйста, пост [ 'hexdump'] (http://www.richpasco.org/utilities/hexdump.html) линии в вопросе из этого файла. Таким образом, мы можем определить, как кодируется «º». –

+0

@MikeSamuel: Добавлен вывод для указанного текста –

ответ

9

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

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

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

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

+0

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

+0

@ Jon Skeet: Поэтому я уверен, что я понимаю здесь, когда файл был написан с использованием специальных символов, используемая кодировка полностью зависела от настроек по умолчанию для программы/JVM, которые создали файл. Когда я вижу свойства файла, кодировка как-то «родовая»? E.x. Если я создам файл в моей системе, с 'System.getProperty (« file.encoding »)' возвращающ 'UTF-8', свойства файла показывают мне кодировку как' UTF-8' для того же самого файла. –

+0

@ darkie15: О каких «свойствах файла» вы говорите? –

1

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

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

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

Приветствия

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