Чтение текстовых файлов неизвестной кодировки в C ++ - PullRequest
2 голосов
/ 24 октября 2011

Что я должен использовать для чтения текстовых файлов, для которых я не знаю их кодировку (ASCII или Unicode)?

Есть ли какой-нибудь класс, который автоматически определяет кодировку?

Ответы [ 3 ]

6 голосов
/ 24 октября 2011

Здесь я могу дать только отрицательный ответ: универсально правильного способа определения кодировки файла не существует.Файл ASCII можно прочитать как кодировку ISO-8859-15, поскольку ASCII является подмножеством.Еще хуже для других файлов может быть допустимо в двух разных кодировках, имеющих разные значения в обоих.Таким образом, вам нужно получить эту информацию другими способами.Во многих случаях это хороший подход, чтобы просто предположить, что все UTF8.Если вы работаете в среде * NIX, переменная LC_CTYPE может оказаться полезной.Если вам не нужна кодировка (например, вы не изменяете и не обрабатываете содержимое), вы можете открывать файлы в двоичном формате.

1 голос
/ 24 октября 2011

Это невозможно в общем случае. Если файл содержит точно байты, которые я здесь печатаю, одинаково действительны как ASCII, UTF-8 или любой из варианты ISO 8859. Несколько эвристик можно использовать как предположение, однако: прочитайте первую «страницу» (512 байт или около того), затем, в следующем заказ:

  1. Посмотрите, начинается ли блок с спецификации в одном из Unicode форматы
  2. Посмотрите на первые четыре байта. Если они содержат `'\ 0'`, вы, вероятно, имея дело с некоторой формой UTF-16 или UTF-32, в соответствии со следующим шаблон: '\0', <i>other</i>, '\0', <i>other</i> UTF16BE <i>other</i>, '\0', <i>other</i>, '\0' UTF16LE '\0', '\0', '\0', <i>other</i> UTF32BE <i>other</i>, '\0', '\0', '\0' UTF32RLE
  3. Ищите байт с установленным старшим битом. Если это начало правовой UTF-8 символ, то файл, вероятно, в UTF-8. В противном случае ... в в регионах, где я работал, ISO 8859-1, как правило, лучший думаю.
  4. В противном случае вы более или менее должны принимать ASCII, пока вы встретить байт с установленным верхним битом (в этот момент вы используете предыдущая эвристика).

Но, как я уже сказал, это не на 100% точно.

(PS. Как мне отформатировать таблицу здесь. Текст в пункте 2 объявлен как HTML-таблица, но, похоже, она не отображается как единое целое.

0 голосов
/ 24 октября 2011

Одним из способов (грубой силой) выполнения может быть

  • Создание списка подходящих кодировок (только iso-кодовые страницы и юникод)
  • Перебор всех рассматриваемых кодировок
  • Кодирование текста с использованием этой кодировки
  • Кодирование его обратно в Unicode
  • Сравнение результатов для ошибок
  • Если ошибок нет, запомните кодировку, которая произвела наименьшее количество байтов

Ссылка: http://www.codeproject.com/KB/recipes/DetectEncoding.aspx

Если вы уверены, что ваша входящая кодировка соответствует ANSI или Unicode, вы также можете проверить метку порядка следования байтов .Но позвольте мне сказать вам, что это не полное доказательство.

...