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
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 enconv
convertir des fichiers texte à un seul encodage.
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
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
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.
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
)
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
}