locked
Существует ли надежный способ определения кодировки текстового файла? RRS feed

  • Общие обсуждения

  • Надежного способа определения произвольной кодовой страницы ANSI не существует, хотя и проводились попытки создать его, основываясь на вероятности обнаружения определенных последовательностей байтов в тексте. Мы не пытаемся сделать это в StreamReader. Несколько форматов файлов, такие как XML или HTML располагают способом указания набора символов в первой строке файла, так что веб-обозреватели, базы данных и классы вроде XmlTextReader могут правильно читать эти файлы. Но у многих текстовых файлов нет такой встроенной информации.

     

    Вместо этого стандарт Юникод определяет один символ (U+FEFF) как метку порядка следования байтов (BOM) Юникода. Если в файле, сохраненном в UTF-16 с прямым или обратным порядком байтов, первые два байта FE FF или FF FE, то можно быть почти уверенным в том, что файл является текстовым файлом UTF-16, а также получить представление о порядке байтов в нем. Хотя UTF-8 не страдает от проблемы порядка байтов, как UTF-16, эту метку порядка следования байтов Юникода по-прежнему можно использовать как надежную подсказку, что файл является текстом UTF-8. Другие кодировки теоретически тоже могут определять некоторые хорошо известные префиксы, которые можно отобразить с помощью Encoding::GetPreamble(), возвращающей интересующий байт[].

     

    StreamReader будет автоматически искать эти последовательности байтов и поправлять кодировку при попытке прочитать первые символы в файле. (По этой причине у StreamReader есть свойство, именуемое CurrentEncoding, а не Encoding.) Его можно отключить, вызвав соответствующий конструктор и передав значение "ложь" для detectEncodingFromByteOrderMarks.

     

    Следует отметить, что StreamWriter также вызовет Encoding::GetPreamble () и впишет эти байты в начало следующего файла. Это великолепно: таким образом можно недвусмысленно определить кодировку текстового файла. Однако многие из наших разработчиков начинали свою карьеру, работая с языком C, и метка порядка следования байтов Юникода в UTF-8 оказалась для них источником путаницы, а порой также и неудобства при взаимодействии с не замечающими Юникода текстовыми редакторами вроде VI или ранних версий emacs. Так что StreamWriter по умолчанию использует версию UTF8Encoding, метод которой GetPreamble возвращает пустой байт []. Можно однозначно указать Encoding.UTF8 в коде, если необходимо вписать метку порядка следования байтов Юникода в файл UTF-8.


    Для связи [Mail]
    • Перемещено Tagore Bandlamudi 3 октября 2010 г. 0:58 MSDN Forums consolidation (От:Форум по .NET Framework)
    18 февраля 2010 г. 12:25
    Модератор