Hay muchos archivos de texto sin formato que se codificaron en conjuntos de caracteres variantes.
Quiero convertirlos a UTF-8, pero antes de ejecutar iconv, necesito saber su codificación original. La mayoría de los navegadores tienen una Auto Detectopción en las codificaciones, sin embargo, no puedo verificar esos archivos de texto uno por uno porque hay demasiados.
Solo conociendo la codificación original, puedo convertir los textos por iconv -f DETECTED_CHARSET -t utf-8.
¿Hay alguna utilidad para detectar la codificación de archivos de texto sin formato? NO tiene que ser 100% perfecto, no me importa si hay 100 archivos mal convertidos en 1,000,000 de archivos.

python-chardeten el repositorio del universo de Ubuntu.chardettodavía dará la suposición más correcta, como./a.txt: GB2312 (confidence: 0.99). En comparación con Enca, que acaba de fallar e informa 'Codificación no reconocida'. Sin embargo, por desgracia,chardetcorre muy lento.chardet <(head -c4000 filename.txt)fue mucho más rápido e igualmente exitoso para mi caso de uso. (en caso de que no esté claro, esta sintaxis bash enviará solo los primeros 4000 bytes a chardet)chardet==3.0.4, y el nombre ejecutable real de la herramienta de línea de comandochardetectno lo eschardet.Usaría este simple comando:
O si desea solo el conjunto de caracteres real (como
utf-8):fuente
filesolo detecta codificaciones con propiedades específicas, como UTF-8 o UTF-16. El resto, el antiguo ISO8859 o sus corresponsales de MS-DOS y Windows, se enumeran como "8 bits desconocidos" o algo similar, incluso para archivos quechardetdetectan con un 99% de confianza.En Linux basado en Debian, el paquete uchardet ( Debian / Ubuntu ) proporciona una herramienta de línea de comandos. Vea a continuación la descripción del paquete:
fuente
uchardettravés de Homebrew.iconvfunciona bien.Para Linux, hay enca y para Solaris puede usar auto_ef .
fuente
enca -d -L zh ./a.txtfalló con el mensaje./a.txt: Unrecognized encoding Failure reason: No clear winner.Como mencionó @grawity,chardetes más laxo, sin embargo, aún es demasiado lento.Mozilla tiene una buena base de código para la detección automática en las páginas web:
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
Descripción detallada del algoritmo:
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
fuente
Volviendo a chardet (python 2.?) Esta llamada podría ser suficiente:
Aunque está lejos de ser perfecto ...
fuente
Para aquellos que usan Emacs regularmente, pueden encontrar útil lo siguiente (permite inspeccionar y validar manualmente la transfomación).
Además, a menudo encuentro que la autodetección de char-set de Emacs es mucho más eficiente que las otras herramientas de autodetección de char-set (como chardet).
Luego, una simple llamada a Emacs con este script como argumento (vea la opción "-l") hace el trabajo.
fuente
Vale la pena probar UTFCast. No funcionó para mí (tal vez porque mis archivos son terribles) pero se ve bien.
http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/
fuente
isutf8(delmoreutilspaquete) hizo el trabajofuente
También en caso de que archives -i te da desconocido
Puede usar este comando php que puede adivinar el conjunto de caracteres como a continuación:
En php puedes marcar como a continuación:
Especificando la lista de codificación explícitamente:
" Mb_list_encodings " más precisos :
Aquí, en el primer ejemplo, puede ver que pongo una lista de codificaciones (detectar el orden de la lista) que podrían coincidir. Para obtener un resultado más preciso, puede usar todas las codificaciones posibles a través de: mb_list_encodings ()
Nota: las funciones mb_ * requieren php-mbstring
Ver respuesta: https://stackoverflow.com/a/57010566/3382822
fuente