62

Есть много простых текстовых файлов, которые были закодированы в различных кодировках.

Я хочу преобразовать их все в UTF-8, но прежде чем запускать iconv, мне нужно знать его оригинальную кодировку. У большинства браузеров есть опция Auto Detect в кодировках, однако я не могу проверить эти текстовые файлы один за другим, потому что их слишком много.

Только узнав оригинальную кодировку, я могу затем преобразовать тексты с помощью iconv -f DETECTED_CHARSET -t utf-8 .

Есть ли какая-нибудь утилита для определения кодировки простых текстовых файлов? Это не обязательно должно быть на 100% идеально, я не возражаю, если в 1 000 000 файлов 100 файлов были неправильно преобразованы.

9 ответов9

49

Попробуйте модуль Python chardet , который доступен на PyPi:

pip install chardet

Затем запустите chardetect myfile.txt .

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

Как упоминалось в комментариях, это довольно медленно, но некоторые дистрибутивы также поставляют оригинальную версию C++, которую @Xavier нашел в https://superuser.com/a/609056. Где-то есть и версия на Java.

32

Я бы использовал эту простую команду:

encoding=$(file -bi myfile.txt)

Или, если вы хотите просто фактический набор символов (например, utf-8):

encoding=$(file -b --mime-encoding myfile.txt)
27

В Linux на основе Debian пакет uchardet (Debian / Ubuntu) предоставляет инструмент командной строки. Смотрите ниже описание пакета:

 universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
16

Для Linux есть enca, а для Solaris вы можете использовать auto_ef.

2

Возвращаемся к chardet (python 2.?) этого вызова может быть достаточно:

python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Хотя это далеко от совершенства ....

echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}
1

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

http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/

1

У Mozilla есть хорошая кодовая база для автоопределения на веб-страницах:
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/

Подробное описание алгоритма:
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html

1

Для тех, кто регулярно использует Emacs, может оказаться полезным следующее (позволяет вручную проверять и проверять трансфомацию).

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

(setq paths (mapcar 'file-truename '(
 "path/to/file1"
 "path/to/file2"
 "path/to/file3"
)))

(dolist (path paths)
  (find-file path)
  (set-buffer-file-coding-system 'utf-8-unix)
  )

Затем простой вызов Emacs с этим сценарием в качестве аргумента (см. Опцию "-l") выполняет свою работу.

0

isutf8 (из пакета moreutils ) сделал свою работу

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .