Tengo varios .htm
archivos que se abren en Gedit sin ninguna advertencia / error, pero cuando abro estos mismos archivos Jedit
, me advierte de una codificación UTF-8 no válida ...
La metaetiqueta HTML dice "charset = ISO-8859-1". Jedit permite una Lista de codificaciones de reserva y una Lista de detectores automáticos de codificación (actualmente "BOM XML-PI"), por lo que mi problema inmediato se ha resuelto. Pero esto me hizo pensar: ¿Qué pasaría si los metadatos no estuvieran allí?
Cuando la información de codificación simplemente no está disponible, ¿existe un programa CLI que pueda adivinar qué codificaciones pueden aplicarse?
Y, aunque es un tema ligeramente diferente; ¿Existe un programa CLI que pruebe la validez de una codificación conocida ?
Respuestas:
El
file
comando hace "mejores conjeturas" sobre la codificación. Use el-i
parámetro para forzarfile
a imprimir información sobre la codificación.Demostración:
Así es como creé los archivos:
Hoy en día todo es utf-8. Pero convéncete a ti mismo:
Compare con https://en.wikipedia.org/wiki/Ä#Computer_encoding
Convierte a las otras codificaciones:
Verifique el volcado hexadecimal:
Crea algo "inválido" mezclando los tres:
Lo que
file
dice:sin
-i
:El
file
comando no tiene idea de "válido" o "inválido". Simplemente ve algunos bytes e intenta adivinar cuál podría ser la codificación. Como humanos, podríamos reconocer que un archivo es un archivo de texto con algunas diéresis en una codificación "incorrecta". Pero como computadora necesitaría algún tipo de inteligencia artificial.Se podría argumentar que la heurística de
file
es algún tipo de inteligencia artificial. Sin embargo, incluso si es así, es muy limitado.Aquí hay más información sobre el
file
comando: http://www.linfo.org/file_command.htmlfuente
, but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1.
file -i` reportadounknown-8bit
. Entonces, esta también parece ser la respuesta a: "Cómo detectar una codificación inválida / desconocida"file -I
con una 'i' mayúscula en lugar de minúsculas.No siempre es posible averiguar con certeza cuál es la codificación de un archivo de texto. Por ejemplo, la secuencia de bytes
\303\275
(c3 bd
en hexadecimal) podría estarý
en UTF-8, oý
en latin1, oĂ˝
en latin2, o羸
en BIG-5, y así sucesivamente.Algunas codificaciones tienen secuencias de bytes no válidas, por lo que es posible descartarlas con seguridad. Esto es cierto en particular de UTF-8; La mayoría de los textos en la mayoría de las codificaciones de 8 bits no son válidos UTF-8. Puede probar para UTF-8 válidos con
isutf8
de moreutils o coniconv -f utf-8 -t utf-8 >/dev/null
, entre otros.Hay herramientas que intentan adivinar la codificación de un archivo de texto. Pueden cometer errores, pero a menudo funcionan en la práctica siempre que no intentes engañarlos deliberadamente.
file
Encode::Guess
(parte de la distribución estándar) intenta codificaciones sucesivas en una cadena de bytes y devuelve la primera codificación en la que la cadena es texto válido.Si hay metadatos (HTML / XML
charset=
, TeX\inputenc
, emacs-*-coding-*-
, ...) en el archivo, los editores avanzados como Emacs o Vim a menudo pueden analizar esos metadatos. Sin embargo, eso no es fácil de automatizar desde la línea de comandos.fuente
iconv
, acabo de ejecutar todas las 1168 codificaciones (incluidos los alias) que figuran eniconv -l
uno de mis archivos .htm ... Hubo 683 codificaciones que pasaron la lista ... El conjunto de caracteres real del archivo = ISO-8859-1 ... compuesto por todos los valores de rango ASCII de la barra uno ... El carácter no ASCII fue \ xA9.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