2011-06-24 08:07:02 +0000 2011-06-24 08:07:02 +0000
74
74
Advertisement

Как автоматически определить кодировку текстового файла?

Advertisement

Существует множество простых текстовых файлов, которые были закодированы в кодировках вариантов.

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

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

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

Advertisement
Advertisement

Ответы (9)

62
62
62
2011-06-24 08:37:06 +0000

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

pip install chardet

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

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

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

30
30
30
2013-06-18 12:44:37 +0000

В Linux на базе Debian, пакет Debian 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
Advertisement
16
16
2011-06-24 08:38:40 +0000
Advertisement

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

2
2
2
2013-10-11 16:06:44 +0000

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

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

2
Advertisement
2
2
2018-11-06 15:42:35 +0000
Advertisement

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

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

(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”) делает эту работу.

1
1
1
2015-10-28 17:34:06 +0000

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

1
Advertisement
1
1
2014-01-23 16:12:16 +0000
Advertisement

Возвращаясь к шардету (питон 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
1
1
2011-09-03 00:48:04 +0000

UTFCast стоит попробовать. Не сработало (может быть, потому что мои файлы ужасны), но выглядит неплохо. http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/

0
Advertisement
0
0
2019-07-12 16:39:09 +0000
Advertisement

Также в случае, если ваш файл -i дает вам неизвестные

Вы можете использовать эту php-команду, которая может угадать кодировку, как показано ниже:

В php вы можете проверить, как показано ниже:

Явное указание списка кодировок :

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

Более точно “ mb_list_encodings”:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

Здесь в первом примере видно, что я поместил список кодировок (определяю порядок следования списков), которые могут совпадать. Для получения более точного результата вы можете использовать все возможные кодировки через : mb_list_encodings()

Примечание mb_* функции требуют php-mbstring

apt-get install php-mbstring

См. ответ: https://stackoverflow.com/a/57010566/3382822

Advertisement

Похожие вопросы

6
10
5
37
11
Advertisement
Advertisement