Usuario del software
2011-06-24 08:07:02 +0000 2011-06-24 08:07:02 +0000
74

¿Cómo detectar automáticamente la codificación de los archivos de texto?

Hay muchos archivos de texto plano que fueron codificados en conjuntos de caracteres variados.

Quiero convertirlos todos a UTF-8, pero antes de ejecutar iconv, necesito saber su codificación original. La mayoría de los navegadores tienen una opción Auto Detect en las codificaciones, sin embargo, no puedo comprobar esos archivos de texto uno por uno porque son demasiados.

Sólo habiendo conocido la codificación original, puedo entonces convertir los textos por iconv -f DETECTED_CHARSET -t utf-8.

¿Existe alguna utilidad para detectar la codificación de los archivos de texto plano? NO tiene que ser 100% perfecto, no me importa si hay 100 archivos mal codificados en 1.000.000 archivos.

Respuestas [9]

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

Prueba el módulo chardet de Python, que está disponible en PyPi:

pip install chardet

Luego ejecute chardetect myfile.txt.

Chardet se basa en el código de detección utilizado por Mozilla, por lo que debería dar resultados razonables, siempre que el texto de entrada sea lo suficientemente largo para el análisis estadístico. Lea la documentación del proyecto .

Como se ha mencionado en los comentarios, es bastante lento, pero algunas distribuciones también incluyen la versión original en C++, como ha encontrado @Xavier en https://superuser.com/a/609056 . También hay una versión Java en alguna parte.

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

En Linux basado en Debian, el paquete uchardet (Debian ](https://packages.qa.debian.org/u/uchardet.html) / Ubuntu ) proporciona una herramienta de línea de comandos. Vea a continuación la descripción del paquete:

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
30
2
2018-11-06 15:42:35 +0000

Para aquellos que usan regularmente Emacs, podrían encontrar útil lo siguiente (permite inspeccionar y validar manualmente la transfomación).

Además, a menudo encuentro que la autodetección de conjuntos de caracteres de Emacs es mucho más eficiente que otras herramientas de autodetección de conjuntos de caracteres (como 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)
  )

Entonces, una simple llamada a Emacs con este script como argumento (ver la opción "-l") hace el trabajo.

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

isutf8 (del paquete moreutils) hizo el trabajo

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

Volviendo a chardet (python 2.?) esta llamada podría ser suficiente:

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

Aunque está lejos de ser perfecta....

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
0
2019-07-12 16:39:09 +0000

También en caso de que el archivo -i le da desconocido

Puede utilizar este comando php que puede adivinar charset como abajo :

En php puede comprobar como abajo :

Especificando la lista de codificación explícitamente :

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

Más preciso " mb_list_encodings":

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

Aquí, en el primer ejemplo, se puede ver que puse una lista de codificaciones (detectar el orden de la lista) que podrían coincidir. Para tener un resultado más preciso se pueden utilizar todas las codificaciones posibles a través de : mb_list_encodings()

Nota las funciones mb_* requieren php-mbstring

apt-get install php-mbstring

Ver respuesta : https://stackoverflow.com/a/57010566/3382822

0