¿Hay un comando de Linux para averiguar si un archivo es UTF-8?

14

Los .iniarchivos de Joomla requieren ser guardados como UTF-8.

Después de editar, no estoy seguro de si los archivos son UTF-8 o no.

¿Hay un comando de Linux como fileo algunos comandos que indiquen si un archivo es realmente UTF-8 o no?

Eduardo
fuente
44
No se puede saber la codificación de un archivo. Solo puedes hacer una suposición inteligente. En su mayoría, puede acertar, pero a veces las suposiciones fallan. filees un ejemplo de un programa que hace conjeturas inteligentes.
Marco
1
@Marco: Sin embargo, es posible verificar si es UTF-8 válido o no. Hay algunas codificaciones que pueden pasar erróneamente como UTF-8 válidas, pero casi nunca sucede con las codificaciones / charsets ISO-8859-𝒏 o Windows-125𝒏.
user1686

Respuestas:

28

Puede determinar la codificación del archivo con el siguiente comando:

file -bi filename
Rik
fuente
3
@nicolas Para MacOS puedes probar file -I filename(-I es una i mayúscula).
Rik
55
¿Esto lee todo el archivo?
ctrl-alt-delor
2
@ kojow7 utf-8 no tiene encabezado. ASCII puro (solo 7 bits), no se puede distinguir de utf-8 (ese es el punto, un encabezado causará todo tipo de problemas). Entonces, si tiene un archivo que es ASCII para el primer MB y luego tiene un solo carácter UTF-8, entonces no lo sabrá, a menos que lea todo el archivo.
ctrl-alt-delor
3
Esto no debe aceptarse como la respuesta. El comando 'archivo' no hace eso; lee solo una parte del archivo y usa números mágicos para adivinar mejor. En ocasiones, 'archivo' puede y le dará la respuesta incorrecta. Para verificar si un archivo pasa una codificación como ascii, iso-8859-1, utf-8 o lo que sea, una buena solución es usar el comando 'iconv'.
Tim
1
Lo he probado, y puede fallar y falla.
Tim
9

Hay, use el isutf8comando del paquete moreutils .

Fuente: ¿Cómo puede saber si un archivo está codificado en UTF-8 o no?


Pablo Olmos de Aguilera C.
fuente
@davidpostill Tengo curiosidad, ¿es una mala práctica citar al autor en la referencia?
Pablo Olmos de Aguilera
No. Sin embargo, es una buena práctica hacer que el enlace diga a dónde me lleva. Supongamos que estoy leyendo solo el texto azul. Después de la edición, puedo decir por qué y cuándo debo hacer clic en eso. Antes no podía. (No fui yo quien hizo la edición, pero estoy como 94% seguro de que de eso se trataba.)
Hermann Döppes
Agradable, y funciona bien con find -type f -exec isutf8 {} +, porque también cita el nombre del archivo. (Y con el uso find ... -exec ... +también es rápido)
Tomasz Gandor
2

No uses el filecomando. No inspecciona todo el archivo, y básicamente adivina. A veces da respuestas incorrectas.

Puede verificar si un archivo pasa la codificación UTF-8 de esta manera:

$ iconv -f utf8 <filename> -t utf8 -o /dev/null

Un código de retorno de cero significa que pasa UTF8. Un código de retorno distinto de cero significa que no es UTF8 válido.

No es posible saber si un archivo se exportó necesariamente mediante un esquema de codificación en particular, ya que algunos esquemas de codificación se superponen. Hacer eso requeriría que los metadatos se incrustaran en el archivo, e incluso entonces confiaría en quien generó ese archivo, en lugar de validarlo usted mismo ... y siempre debe validarlo usted mismo.

Tim
fuente
0

Otra forma es usar recode, que saldrá con un error si intenta decodificar UTF-8 y encuentra caracteres no válidos.

if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
    echo "Valid utf8 : $FILE"
else
    echo "NOT valid utf8: $FILE"
fi
mivk
fuente