Проблема StreamReader — неизвестная кодировка файла (западный ISO 88591)

StackOverflow https://stackoverflow.com/questions/370801

Вопрос

При чтении данных из входного файла я заметил, что символ ¥ не читается StreamReader.Mozilla Firefox показывал тип входного файла как Western (ISO-8859-1).

Поигравшись с параметрами кодирования, я обнаружил, что он успешно работает для следующих значений:

System.Text.Encoding.GetEncoding(1252) // (western iso 88591)

System.Text.Encoding.Default 

System.Text.Encoding.UTF7

Сейчас я планирую использовать настройку «По умолчанию», однако не уверен, что это правильное решение.В существующем коде не использовалась никакая кодировка, и я боюсь, что могу что-нибудь сломать.

Я знаю очень мало (или, скорее, ничего) о кодировании.Как мне это сделать?Безопасно ли мое решение использовать System.Text.Encoding.Default?Должен ли я просить пользователя сохранить файлы в определенном формате?

Это было полезно?

Решение

Кодовая страница 1252 — это не совсем то же самое, что ISO-Latin-1.Если вам нужен ISO-Latin-1, используйте Encoding.GetEncoding(28591).Однако я ожидаю, что для этой кодовой точки они будут одинаковыми (U+00A5).UTF-7 совершенно другой (и почти никогда не тот, который вы хотите использовать).

Encoding.Default является нет безопасно — в большинстве ситуаций это действительно плохая идея.Это зависит от конкретного компьютера, на котором вы работаете.Если вы переносите файл с одного компьютера на другой, кто знает, какую кодировку использовал исходный компьютер?

Если вы знаете, что ваш файл имеет формат ISO-8859-1, используйте это явно.Что создает эти файлы?Если они просто сохраняются пользователем, в какой программе они сохраняются?Если возможен вариант UTF-8, это хорошо — отчасти потому, что он может работать со всем Unicode.

у меня есть статья о Юникоде и еще один на отладка проблем с Unicode которые могут оказаться вам полезными.

Другие советы

Существующий код не использовал никакой кодировки

Возможно, кодировка не указана явно, и в этом случае, вероятно, по умолчанию используется кодировка Encoding.UTF8.

Имя Encoding.Default может создать впечатление, что это кодировка по умолчанию, используемая такими классами, как StreamReader, но это не так:Как отметил Джон Скит, Encoding.Default — это кодировка текущей кодовой страницы ANSI операционной системы.

Лично я считаю, что это делает имя свойства Encoding.Default несколько вводящим в заблуждение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top