iconv tout encodage UTF-8

j'essaye de pointer iconv vers un répertoire et tous les fichiers seront convertis UTF-8 quel que soit le codage actuel

j'utilise ce script mais vous devez spécifier L'encodage à partir duquel vous allez. Comment puis-je le faire autodétecter le codage actuel?

dir_iconv.sh

#!/bin/bash

ICONVBIN='/usr/bin/iconv' # path to iconv binary

if [ $# -lt 3 ]
then
    echo " dir from_charset to_charset"
    exit
fi

for f in /*
do
    if test -f $f
    then
        echo -e "nConverting $f"
        /bin/mv $f $f.old
        $ICONVBIN -f  -t  $f.old > $f
    else
        echo -e "nSkipping $f - not a regular file";
    fi
done

borne

sudo convert/dir_iconv.sh convert/books CURRENT_ENCODING utf8
18
demandé sur Blainer 2012-03-22 19:01:39

6 réponses

Peut-être que vous êtes à la recherche pour enca:

Enca est un analyseur de Charset extrêmement naïf. Il détecte le jeu de caractères et l'encodage des fichiers texte et peut également les convertir en d'autres encodages en utilisant soit un convertisseur intégré ou bibliothèques et outils externes comme libiconv, librecode, ou cstocs.

Actuellement, il soutient Biélorusse, Bulgare, Croate, Tchèque, estonien, hongrois, letton, lituanien, polonais, Russe, Slovaque, Slovène, Ukrainien, Chinois, et quelques encodages multibyte indépendamment sur la langue.

notez qu'en général, l'autodétection de l'encodage courant est un processus difficile (la même séquence d'octets peut être un texte correct dans plusieurs encodages). enca utilise des heuristiques basées sur le langage que vous lui dites de détecter (pour limiter le nombre d'encodages). Vous pouvez utiliser enconvconvertir des fichiers texte à un seul encodage.

18
répondu Michal Kottman 2014-03-09 18:04:34

vous pouvez obtenir ce dont vous avez besoin en utilisant le fichier gnu utils standard et awk. Exemple:

file -bi .xsession-errors donne-moi: "text / plain; charset=us-ascii"

file -bi .xsession-errors |awk -F "=" '{print }' donne-moi "us-ascii"

je l'utiliser dans des scripts comme suit:

CHARSET="$(file -bi "$i"|awk -F "=" '{print }')"

if [ "$CHARSET" != utf-8 ]; then

        iconv -f "$CHARSET" -t utf8 "$i" -o outfile

fi
9
répondu Julian Hughes 2012-08-26 19:18:57

compilant toutes les réponses. Aller à dir, créer dir2utf8.sh :

#!/bin/bash
# converting all files in a dir to utf8 

for f in *
do
    if test -f $f then
        echo -e "\nConverting $f"
        CHARSET="$( file -bi "$f"|awk -F "=" '{print }')"
        if [ "$CHARSET" != utf-8 ]; then
                iconv -f "$CHARSET" -t utf8 "$f" -o "$f"
        fi
    else
        echo -e "\nSkipping $f - it's a regular file";
    fi
done
6
répondu Douglas Fernandes 2012-11-06 19:37:01

voici ma solution pour installer tous les fichiers:

#!/bin/bash

apt-get -y install recode uchardet > /dev/null
find "" -type f | while read FFN # 'dir' should be changed...
do
    encoding=$(uchardet "$FFN")
    echo "$FFN: $encoding"
    enc=`echo $encoding | sed 's#^x-mac-#mac#'`
    set +x
    recode $enc..UTF-8 "$FFN"
done

https://gist.github.com/demofly/25f856a96c29b89baa32

mettre dans convert-dir-to-utf8.sh et exécuter:

bash convert-dir-to-utf8.sh /pat/to/my/trash/dir

notez que sed est une solution de contournement pour les encodages mac ici. Beaucoup d'encodages peu communs ont besoin de solutions de rechange comme celle-ci.

3
répondu demofly 2014-04-03 15:38:03

consultez les outils disponibles pour une conversion de données dans un cli linux:https://www.debian.org/doc/manuals/debian-reference/ch11.en.html

il y a aussi une recherche pour trouver une liste complète des encodages qui sont disponibles en iconv. Il suffit d'exécuter iconv --list et savoir que l'encodage des noms diffère de noms renvoyés par uchardet outil (par exemple: x-mac-cyrillique uchardet vs mac-cyrillique iconv)

0
répondu demofly 2014-04-03 15:33:21

la commande enca ne fonctionne pas pour mon fichier texte chinois simplifié avec encodage GB2312.

à la place, j'utilise la fonction suivante pour convertir le fichier texte pour moi. Vous pouvez bien sûr rediriger la sortie dans un fichier.

il faut chardet et iconv commandes.

detection_cat () 
{
    DET_OUT=$(chardet );
    ENC=$(echo $DET_OUT | sed "s|^.*: \(.*\) (confid.*$||");
    iconv -f $ENC 
}
0
répondu Jared Tsai 2015-10-07 04:21:51