В нашем приложении мы получаем текстовые файлы ( .txt
, .csv
и т.д.) из различных источников. При чтении эти файлы иногда содержат мусор, поскольку файлы были созданы в другой / неизвестной кодовой странице.
Есть ли способ (автоматически) определить кодовую страницу текстового файла?
detectEncodingFromByteOrderMarks
, На StreamReader
конструкторе, работает UTF8
и другие Юникод отмеченных файлов, но я искал способ обнаружения кодовых страниц, как ibm850
, windows1252
.
Спасибо за ваши ответы, это то, что я сделал.
Файлы, которые мы получаем от конечных пользователей, не имеют понятия о кодовых страницах. Получатели также являются конечными пользователями, и теперь они знают о кодовых страницах: кодовые страницы существуют и раздражают.
Решение:
- Откройте полученный файл в Блокноте, посмотрите на искаженный фрагмент текста. Если кого-то зовут Франсуа или что-то еще, с вашим человеческим интеллектом вы можете догадаться об этом.
- Я создал небольшое приложение, с помощью которого пользователь может открыть файл и ввести текст, который, как он знает, будет отображаться в файле при использовании правильной кодовой страницы.
- Переберите все кодовые страницы и отобразите те, которые дают решение, с предоставленным пользователем текстом.
- Если появляется более одной кодовой страницы, попросите пользователя указать больше текста.
Если вы хотите обнаружить кодировки, отличные от UTF (т. Е. Нет спецификации), вы в основном дошли до эвристики и статистического анализа текста. Возможно, вы захотите взглянуть на статью Mozilla об универсальном обнаружении кодировок ( та же ссылка, с лучшим форматированием через Wayback Machine ).
источник
Вы пробовали порт C # для Mozilla Universal Charset Detector
Пример с http://code.google.com/p/ude/
источник
private Encoding GetEncodingFromString(string encoding) { try { return Encoding.GetEncoding(encoding); } catch { return Encoding.ASCII; } }
Это явно неверно. Каждый веб-браузер имеет своего рода универсальный детектор кодировки для работы со страницами, которые не имеют никаких признаков кодировки. У Firefox есть один. Вы можете скачать код и посмотреть, как он это делает. Смотрите некоторую документацию здесь . По сути, это эвристика, но она работает очень хорошо.
Учитывая разумное количество текста, можно даже определить язык.
Вот еще один, который я только что нашел с помощью Google:
источник
a character encoding declaration is required even if the encoding is US-ASCII
- отсутствие декларации приводит к использованию эвристического алгоритма, а не к UTF8.Я знаю, что уже слишком поздно для этого вопроса, и это решение не понравится некоторым (из-за его англо-ориентированного уклона и отсутствия статистического / эмпирического тестирования), но оно очень хорошо для меня, особенно для обработки выгруженных данных CSV:
http://www.architectshack.com/TextFileEncodingDetector.ashx
Преимущества:
Примечание: я тот, кто написал этот класс, так что, очевидно, возьмите его с собой! :)
источник
Notepad ++ имеет эту функцию из коробки. Это также поддерживает изменение этого.
источник
В поисках другого решения я обнаружил, что
https://code.google.com/p/ude/
это решение довольно тяжелое.
Мне нужно было базовое обнаружение кодирования, основанное на 4 первых байтах и, возможно, обнаружение кодировки xml - поэтому я взял пример исходного кода из Интернета и добавил слегка измененную версию
http://lists.w3.org/Archives/Public/www-validator/2002Aug/0084.html
написано для Java.
Достаточно прочитать первые 1024 байта из файла, но я загружаю весь файл.
источник
Если кто-то ищет решение на 93,9%. Это работает для меня:
источник
Я сделал нечто подобное в Python. По сути, вам нужно много примеров данных из различных кодировок, которые разбиты скользящим двухбайтовым окном и хранятся в словаре (хэш), который основан на байтовых парах, предоставляющих значения списков кодировок.
Учитывая этот словарь (хэш), вы берете свой входной текст и:
Если вы также сэмплировали тексты в кодировке UTF, которые не начинаются с какой-либо спецификации, второй шаг будет охватывать те, которые были пропущены с первого шага.
Пока что это работает для меня (выборочные данные и последующие входные данные являются субтитрами на разных языках) с уменьшением количества ошибок.
источник
Инструмент "uchardet" делает это хорошо, используя модели распределения частот символов для каждой кодировки. Большие файлы и более «типичные» файлы имеют большую уверенность (очевидно).
На Ubuntu, вы просто
apt-get install uchardet
.В других системах получите источник, использование и документы здесь: https://github.com/BYVoid/uchardet
источник
brew install uchardet
Конструктор класса StreamReader принимает параметр «обнаружение кодировки».
источник
Если вы можете ссылаться на библиотеку C, вы можете использовать
libenca
. См. Http://cihar.com/software/enca/ . Со страницы руководства:Это GPL v2.
источник
Получил ту же проблему, но пока не нашел хорошего решения для ее автоматического определения. Теперь я использую PsPad (www.pspad.com) для этого;) Работает нормально
источник
Поскольку это в основном сводится к эвристике, это может помочь использовать кодирование ранее полученных файлов из того же источника в качестве первой подсказки.
Большинство людей (или приложений) делают вещи в одном и том же порядке каждый раз, часто на одной и той же машине, поэтому вполне вероятно, что когда Боб создает файл .csv и отправляет его Мэри, он всегда будет использовать Windows-1252 или какой бы ни была его машина по умолчанию.
Там, где это возможно, немного обучения клиентов тоже не повредит :-)
источник
На самом деле я искал общий, не программирующий способ определения кодировки файла, но пока не нашел. Что я нашел, протестировав с различными кодировками, так это то, что мой текст был UTF-7.
Итак, где я впервые делал: StreamReader file = File.OpenText (fullfilename);
Мне пришлось изменить его на: StreamReader file = new StreamReader (полное имя файла, System.Text.Encoding.UTF7);
OpenText предполагает, что это UTF-8.
вы также можете создать StreamReader, как этот новый StreamReader (fullfilename, true), второй параметр означает, что он должен попытаться обнаружить кодировку по метке byteorder файла, но в моем случае это не сработало.
источник
Откройте файл в AkelPad (или просто скопируйте / вставьте искаженный текст), перейдите в Edit -> Selection -> Recode ... -> отметьте «Autodetect».
источник
Как дополнение к сообщению ITmeze, я использовал эту функцию для преобразования вывода порта C # для Mozilla Universal Charset Detector
MSDN
источник
Спасибо @ Erik Aronesty за упоминание
uchardet
.В то же время (? Же) инструмент существует для Linux:
chardet
.Или, на Cygwin вы можете использовать:
chardetect
.См. Справочную страницу chardet: https://www.commandlinux.com/man-page/man1/chardetect.1.html.
Это будет эвристически определять (угадывать) кодировку символов для каждого данного файла и сообщать имя и уровень достоверности для обнаруженной кодировки символов каждого файла.
источник
Я использую этот код для определения кодовой страницы ANSI по умолчанию в Юникоде и Windows при чтении файла. Для других кодировок необходима проверка содержимого, вручную или путем программирования. Это можно использовать для сохранения текста в той же кодировке, что и при его открытии. (Я использую VB.NET)
источник
10 лет (!) Прошло с тех пор, как об этом спросили, и все же я не вижу упоминания о хорошем решении MS, не подпадающем под GPL: IMultiLanguage2 API.
Большинство уже упомянутых библиотек основаны на UDE Mozilla - и кажется разумным, что браузеры уже решали подобные проблемы. Я не знаю, каково решение Chrome, но с тех пор, как IE 5.0 MS выпустила их, это:
Это собственный COM-вызов, но вот очень хорошая работа Карстена Цоймера, которая обрабатывает беспорядок взаимодействия для использования .net. Вокруг есть и другие, но в целом эта библиотека не получает того внимания, которого заслуживает.
источник