Проблема StreamReader — неизвестная кодировка файла (западный ISO 88591)
-
21-08-2019 - |
Вопрос
При чтении данных из входного файла я заметил, что символ ¥ не читается 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 несколько вводящим в заблуждение.
Вы разработчик программного обеспечения?не забудьте прочитать Джоэла СпольскиАбсолютный минимум, который каждый разработчик программного обеспечения обязательно должен знать о Юникоде и наборах символов (без оправданий!)