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 Detect
opció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-chardet
en el repositorio del universo de Ubuntu.chardet
todaví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,chardet
corre 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 comandochardetect
no lo eschardet
.Usaría este simple comando:
O si desea solo el conjunto de caracteres real (como
utf-8
):fuente
file
solo 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 quechardet
detectan 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
uchardet
través de Homebrew.iconv
funciona bien.Para Linux, hay enca y para Solaris puede usar auto_ef .
fuente
enca -d -L zh ./a.txt
falló con el mensaje./a.txt: Unrecognized encoding Failure reason: No clear winner.
Como mencionó @grawity,chardet
es 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
(delmoreutils
paquete) 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