Necesito encontrar la codificación de todos los archivos que se colocan en un directorio. ¿Hay alguna manera de encontrar la codificación utilizada?
El file
comando no puede hacer esto.
La codificación que me interesa es: ISO-8859-1. Si la codificación es otra cosa, quiero mover el archivo a otro directorio.
apropos encoding
. Busca los títulos y descripciones de todas las páginas de manual. Cuando hago esto en mi máquina, veo 3 herramientas que me puedan ayudar, a juzgar por sus descripciones:chardet
,chardet3
,chardetect3
. Luego, al hacerman chardet
y leer la página de manual, me dice que esachardet
es la utilidad que necesito.us-ascii
, pero después de agregar una línea de comentario chino, se convierte enutf-8
.file
puede decir la codificación leyendo el contenido del archivo y adivinar.Respuestas:
Suena como si estuvieras buscando
enca
. Puede adivinar e incluso convertir entre codificaciones. Solo mira la página del manual .O, en su defecto, use
file -i
(linux) ufile -I
(osx). Eso generará información de tipo MIME para el archivo, que también incluirá la codificación del juego de caracteres. También encontré una página de manual para ello :)fuente
enca
parece ser completamente inútil para analizar un archivo escrito en inglés, pero si está buscando algo en estonio, podría resolver todos sus problemas. Herramienta muy útil, que ... </sarcasm>Si te gusta hacer esto por un montón de archivos
fuente
Do not prepend filenames to output lines
file -b --mime-encoding
solo genera la codificación deluchardet : una biblioteca de detectores de codificación portada desde Mozilla.
Uso:
Varias distribuciones de Linux (Debian / Ubuntu, OpenSuse-packman, ...) proporcionan binarios.
fuente
sudo apt-get install uchardet
es tan fácil que decidí no preocuparme por eso ...uchardet
tiene una gran ventaja sobrefile
yenca
, en el sentido de que analiza todo el archivo (solo lo intenté con un archivo de 20GiB) en lugar de solo el comienzo.Aquí hay un script de ejemplo que usa el archivo -I e iconv que funciona en MacOsX. Para su pregunta, necesita usar mv en lugar de iconv
fuente
file -b --mime-encoding
produce solo el juego de caracteres, para que pueda evitar todo el procesamiento de tuberíasEs realmente difícil determinar si es iso-8859-1. Si tiene un texto con solo caracteres de 7 bits que también podría ser iso-8859-1 pero no lo sabe. Si tiene caracteres de 8 bits, los caracteres de la región superior también existen en codificaciones de orden. Por lo tanto, tendría que usar un diccionario para adivinar mejor qué palabra es y determinar a partir de ahí qué letra debe ser. Finalmente, si detecta que puede ser utf-8, está seguro de que no es iso-8859-1
La codificación es una de las cosas más difíciles de hacer porque nunca se sabe si nada te dice
fuente
En Debian también puedes usar
encguess
:fuente
uchardet
en Ubuntu y me dijo que mi archivo eraWINDOWS-1252
. Sé que esto estaba mal porque lo guardé como UTF-16 con Kate, para probar. Sin embargo,encguess
adivine correctamente, y fue preinstalado en Ubuntu 19.04.Para convertir la codificación de 8859 a ASCII:
fuente
Con Python, puede usar el módulo chardet: https://github.com/chardet/chardet
fuente
Esto no es algo que pueda hacer de manera infalible. Una posibilidad sería examinar cada carácter en el archivo para asegurarse de que no contenga ningún carácter en los rangos
0x00 - 0x1f
o0x7f -0x9f
, como dije, esto puede ser cierto para cualquier número de archivos, incluida al menos otra variante de ISO8859.Otra posibilidad es buscar palabras específicas en el archivo en todos los idiomas admitidos y ver si puede encontrarlas.
Entonces, por ejemplo, encuentre el equivalente del inglés "y", "pero", "a", "de" y así sucesivamente en todos los idiomas admitidos de 8859-1 y vea si tienen una gran cantidad de ocurrencias dentro del expediente.
No estoy hablando de traducción literal como:
Aunque eso es posible. Estoy hablando de palabras comunes en el idioma de destino (por lo que sé, el islandés no tiene una palabra para "y" - probablemente tendría que usar su palabra para "pez" [lo siento, es un poco estereotípico, no lo hice significa cualquier ofensa, solo ilustrando un punto]).
fuente
Sé que está interesado en una respuesta más general, pero lo que es bueno en ASCII generalmente es bueno en otras codificaciones. Aquí hay una línea única de Python para determinar si la entrada estándar es ASCII. (Estoy bastante seguro de que esto funciona en Python 2, pero solo lo he probado en Python 3.)
fuente
Si está hablando de archivos XML (ISO-8859-1), la declaración XML dentro de ellos especifica la codificación: por lo
<?xml version="1.0" encoding="ISO-8859-1" ?>
tanto, puede usar expresiones regulares (por ejemplo, con
perl
) para verificar cada archivo para dicha especificación.Puede encontrar más información aquí: Cómo determinar la codificación de archivos de texto .
fuente
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
fuente
En Cygwin, parece que funciona para mí:
Ejemplo:
Puede canalizar eso a awk y crear un comando iconv para convertir todo a utf8, desde cualquier codificación fuente admitida por iconv.
Ejemplo:
fuente
Puede extraer la codificación de un solo archivo con el comando de archivo. Tengo un archivo sample.html con:
sample.html: documento HTML, texto UTF-8 Unicode, con líneas muy largas
Documento HTML, texto Unicode UTF-8, con líneas muy largas
texto / html; charset = utf-8
utf-8
fuente
Estoy usando el siguiente script para
.
fuente
con este comando:
Puede enumerar todos los archivos en un directorio y subdirectorios y la codificación correspondiente.
fuente
Con Perl, use Encode :: Detect.
fuente