GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo recodificar a UTF-8 condicionalmente?

Este mensaje es bastante antiguo, pero creo que puedo contribuir a este problema:
Primero cree un script llamado recodeifneeded :

#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")

if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi

Puedes usarlo de esta manera:

recodeifneeded utf-8 file.txt

Entonces, si desea ejecutarlo de forma recursiva y cambiar todas las codificaciones de archivos *.txt a (digamos) utf-8:

find . -name "*.txt" -exec recodeifneeded utf-8 {} \;

Espero que esto ayude.


Este script, adaptado de la idea de harrymc, que recodifica un archivo condicionalmente (basado en la existencia de ciertos caracteres escandinavos codificados en UTF-8), parece funcionar bastante bien para mí.

$ cat recode-to-utf8.sh 

#!/bin/sh
# Recodes specified file to UTF-8, except if it seems to be UTF-8 already

result=`grep -c [åäöÅÄÖ] $1` 
if [ "$result" -eq "0" ]
then
    echo "Recoding $1 from ISO-8859-1 to UTF-8"
    recode ISO-8859-1..UTF-8 $1 # overwrites file
else
    echo "$1 was already UTF-8 (probably); skipping it"
fi

(El procesamiento por lotes de archivos es, por supuesto, una simple cuestión de, por ejemplo, for f in *txt; do recode-to-utf8.sh $f; done .)

NOTA :esto depende totalmente de que el archivo de script sea UTF-8. Y como esta es obviamente una solución muy limitada adecuada para el tipo de archivos que tengo, no dude en agregar mejores respuestas que resuelven el problema de una forma más genérica.


UTF-8 tiene reglas estrictas sobre qué secuencias de bytes son válidas. Esto significa que si los datos pudieran sea ​​UTF-8, rara vez obtendrá falsos positivos si asume que es .

Entonces puedes hacer algo como esto (en Python):

def convert_to_utf8(data):
    try:
        data.decode('UTF-8')
        return data  # was already UTF-8
    except UnicodeError:
        return data.decode('ISO-8859-1').encode('UTF-8')

En un script de shell, puede usar iconv para realizar la conversión, pero necesitará un medio para detectar UTF-8. Una forma es usar iconv con UTF-8 como codificaciones de origen y de destino. Si el archivo era UTF-8 válido, la salida será la misma que la entrada.


Linux
  1. Cómo convertir archivos a codificación UTF-8 en Linux

  2. ¿Cómo quitar el Bom de un archivo Utf-8?

  3. ¿Cómo cambiar el nombre de un archivo en Linux?

  4. Cómo grep \n en el archivo

  5. ¿Cómo detectar si un archivo tiene un BOM UTF-8 en Bash?

Cómo montar un archivo ISO en Linux

Cómo extraer (descomprimir) el archivo tar.xz

Cómo crear un archivo Tar Gz

Cómo descomprimir (abrir) un archivo Gz

Cómo vincular un archivo en Linux

Cómo hacer eco en un archivo