Есть много простых текстовых файлов, которые были закодированы в различных кодировках.
Я хочу преобразовать их все в UTF-8, но прежде чем запускать iconv, мне нужно знать его оригинальную кодировку. У большинства браузеров есть Auto Detect
опция в кодировках, однако я не могу проверить эти текстовые файлы один за другим, потому что их слишком много.
Только узнав оригинальную кодировку, я смогу затем преобразовать тексты iconv -f DETECTED_CHARSET -t utf-8
.
Есть ли какая-нибудь утилита для определения кодировки простых текстовых файлов? Это не обязательно должно быть на 100% идеально, я не возражаю, если в 1 000 000 файлов было неправильно преобразовано 100 файлов.
python-chardet
в репозитории Ubuntu Universe.chardet
все равно даст наиболее правильное предположение, как./a.txt: GB2312 (confidence: 0.99)
. По сравнению с Enca, которая только что потерпела неудачу и сообщает «Нераспознанная кодировка». Однако, к сожалению,chardet
работает очень медленно.chardet <(head -c4000 filename.txt)
был намного быстрее и одинаково успешен для моего варианта использования. (если неясно, этот синтаксис bash будет отправлять только первые 4000 байтов в chardet)chardet==3.0.4
, а фактическое имя исполняемого файла инструмента командной строки -chardetect
нетchardet
.Я бы использовал эту простую команду:
Или, если вы хотите просто фактический набор символов (например
utf-8
):источник
file
обнаруживает только кодировки с определенными свойствами, такими как UTF-8 или UTF-16. Остальные - устаревшие ISO8859 или их корреспонденты MS-DOS и Windows - перечислены как «unknown-8bit» или что-то подобное, даже для файлов, которыеchardet
обнаруживают с вероятностью 99%.В Linux на основе Debian пакет uchardet ( Debian / Ubuntu ) предоставляет инструмент командной строки. Смотрите ниже описание пакета:
источник
uchardet
через Homebrew.iconv
работает нормально.Для Linux есть enca, а для Solaris вы можете использовать auto_ef .
источник
enca -d -L zh ./a.txt
с сообщением./a.txt: Unrecognized encoding Failure reason: No clear winner.
Как упоминалось @grawity,chardet
он более слабый, но все же слишком медленный.У Mozilla есть хорошая кодовая база для автоматического определения на веб-страницах:
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
Подробное описание алгоритма:
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
источник
Возвращаясь к chardet (python 2.?), Этого вызова может быть достаточно:
Хотя это далеко от совершенства ....
источник
Для тех, кто регулярно использует Emacs, может оказаться полезным следующее (позволяет вручную проверять и проверять трансфомацию).
Более того, я часто нахожу, что автоопределение набора символов в Emacs гораздо более эффективно, чем другие инструменты автоопределения набора символов (такие как chardet).
Затем простой вызов Emacs с этим сценарием в качестве аргумента (см. Параметр «-l») выполняет свою работу.
источник
UTFCast стоит попробовать. У меня не сработало (может быть, потому что мои файлы ужасны), но выглядит хорошо.
http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/
источник
isutf8
(изmoreutils
пакета) сделал работуисточник
Также в случае, если вы подаете -i дает вам неизвестное
Вы можете использовать эту команду php, которая может угадать кодировку, как показано ниже:
В PHP вы можете проверить, как показано ниже:
Указание списка кодировки явно:
Более точные " mb_list_encodings ":
Здесь, в первом примере, вы можете видеть, что я поместил список кодировок (определите порядок списков), которые могут совпадать. Чтобы получить более точный результат, вы можете использовать все возможные кодировки с помощью: mb_list_encodings ()
Обратите внимание, что функции mb_ * требуют php-mbstring
Смотрите ответ: https://stackoverflow.com/a/57010566/3382822
источник