Как я могу определить кодировку / кодовую страницу текстового файла - PullRequest
286 голосов
/ 18 сентября 2008

В нашем приложении мы получаем текстовые файлы (.txt, .csv и т. Д.) Из разных источников. При чтении эти файлы иногда содержат мусор, поскольку файлы были созданы в другой / неизвестной кодовой странице.

Есть ли способ (автоматически) обнаружить кодовую страницу текстового файла?

detectEncodingFromByteOrderMarks в конструкторе StreamReader работает для UTF8 и других файлов, помеченных юникодом, но я ищу способ обнаружения кодовых страниц, таких как ibm850, windows1252.


Спасибо за ваши ответы, вот что я сделал.

Файлы, которые мы получаем от конечных пользователей, не имеют понятия о кодовых страницах. Получатели также являются конечными пользователями, и теперь они знают о кодовых страницах: кодовые страницы существуют и раздражают.

Решение:

  • Откройте полученный файл в Блокноте, посмотрите на искаженный фрагмент текста. Если кого-то зовут Франсуа или что-то еще, с вашим человеческим интеллектом вы можете догадаться об этом.
  • Я создал небольшое приложение, с помощью которого пользователь может открыть файл и ввести текст, который, как ему известно, появится в файле при использовании правильной кодовой страницы.
  • Перебирайте все кодовые страницы и отображайте те, которые дают решение, с предоставленным пользователем текстом.
  • Если появляется больше одной кодовой страницы, попросите пользователя указать больше текста.

Ответы [ 20 ]

3 голосов
/ 03 декабря 2013

Инструмент "uchardet" делает это хорошо, используя модели распределения частот символов для каждой кодировки. Большие файлы и более «типичные» файлы имеют большую уверенность (очевидно).

В Ubuntu вы просто apt-get install uchardet.

В других системах получить источник, использование и документы здесь: https://github.com/BYVoid/uchardet

1 голос
/ 27 марта 2013

Если вы можете создать ссылку на библиотеку C, вы можете использовать libenca. См. http://cihar.com/software/enca/. со страницы руководства:

Enca читает заданные текстовые файлы или стандартный ввод, если ничего не указано, и использует знания об их языке (должны быть поддержаны вами) и смесь парсинга, статистического анализа, гадания и черной магии определить их кодировки.

Это GPL v2.

0 голосов
/ 22 августа 2016

Откройте файл в AkelPad (или просто скопируйте / вставьте искаженный текст), перейдите в «Правка» -> «Выбор» -> «Перекодировать» -> установите флажок «Автоопределение».

0 голосов
/ 18 сентября 2008

Получил ту же проблему, но пока не нашел хорошего решения для ее автоматического определения. Теперь я использую PsPad (www.pspad.com) для этого;) Отлично работает

0 голосов
/ 03 сентября 2015

Как дополнение к сообщению ITmeze, я использовал эту функцию для преобразования вывода порта C # для универсального детектора Charz Mozilla

    private Encoding GetEncodingFromString(string codePageName)
    {
        try
        {
            return Encoding.GetEncoding(codePageName);
        }
        catch
        {
            return Encoding.ASCII;
        }
    }

MSDN

0 голосов
/ 29 декабря 2008

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

Большинство людей (или приложений) каждый раз делают вещи в одном и том же порядке, часто на одной и той же машине, поэтому вполне вероятно, что когда Боб создает файл .csv и отправляет его Мэри, он всегда будет использовать Windows -1252 или как его машина по умолчанию.

Там, где это возможно, немного обучения клиентов тоже не повредит: -)

0 голосов
/ 20 августа 2010

Я действительно искал общий, а не программный способ определения кодировки файла, но пока не нашел. Что я нашел, протестировав с различными кодировками, так это то, что мой текст был UTF-7.

Итак, где я впервые делал: Файл StreamReader = File.OpenText (полное имя файла);

Я должен был изменить это на: Файл StreamReader = новый StreamReader (полное имя файла, System.Text.Encoding.UTF7);

OpenText предполагает, что это UTF-8.

вы также можете создать StreamReader, как это new StreamReader (fullfilename, true), второй параметр, означающий, что он должен попытаться обнаружить кодировку по метке byteorder файла, но в моем случае это не сработало.

0 голосов
/ 07 мая 2018

Спасибо @ Эрику Аронести за упоминание uchardet.

Между тем (для Linux) существует (такой же?) Инструмент: chardet.
Или на Cygwin вы можете использовать: chardetect.

См .: Страница справочника chardet: https://www.commandlinux.com/man-page/man1/chardetect.1.html

Это будет эвристически определять (угадывать) кодировку символов для каждого данного файла и сообщать имя и уровень достоверности для обнаруженной кодировки символов каждого файла.

0 голосов
/ 03 июня 2018

10Y (!) Прошло с тех пор, как об этом спросили, и до сих пор я не вижу упоминаний о хорошем решении MS, не поддерживающем GPL: IMultiLanguage2 API.

Большинство уже упомянутых библиотек основаны на UDE Mozilla - и кажется разумным, что браузеры уже решили подобные проблемы. Я не знаю, каково решение Chrome, но с тех пор, как IE 5.0 MS выпустил их, это:

  1. Без проблем с лицензией GPL и тому подобным,
  2. Поддерживается и поддерживается, вероятно, навсегда,
  3. Дает расширенный вывод - все действительные кандидаты на кодирование / кодовые страницы вместе с оценками достоверности,
  4. Удивительно прост в использовании (это вызов одной функции).

Это собственный вызов COM, но вот очень хорошая работа Карстена Цоймера, которая обрабатывает беспорядок взаимодействия для использования .net. Вокруг есть и другие, но в целом эта библиотека не получает того внимания, которого она заслуживает.

0 голосов
/ 02 июня 2012

Я использую этот код для определения кодовой страницы ANSI по умолчанию в Unicode и Windows при чтении файла. Для других кодировок необходима проверка содержимого, вручную или путем программирования. Это можно использовать для сохранения текста в той же кодировке, что и при его открытии. (Я использую VB.NET)

'Works for Default and unicode (auto detect)
Dim mystreamreader As New StreamReader(LocalFileName, Encoding.Default) 
MyEditTextBox.Text = mystreamreader.ReadToEnd()
Debug.Print(mystreamreader.CurrentEncoding.CodePage) 'Autodetected encoding
mystreamreader.Close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...