Bonjour,
J'ai plein de fichiers en UTF-8859-1, et je voudrais tous les passer en UTF8 avec une commande.
Est-ce que cela existe ?
Bonjour,
J'ai plein de fichiers en UTF-8859-1, et je voudrais tous les passer en UTF8 avec une commande.
Est-ce que cela existe ?
man iconvEnvoyé par gifffftane
iconv -f ISO-8859-1 -t UTF-8 filename.in > filename.out
Déjà, iconv, c'est bien, merci.![]()
Mais... et si je veux changer de nombreux fichiers répartis dans un répertoire et ses sous-répertoires ? D'après le man, je ne peux modifier les fichiers que un par un, et je dois tous les renommer![]()
ça n'a rien à voir avec iconv…Envoyé par gifffftane
c'est un problème classique de traitement de fichiers :
vous faites un script qui prend en paramètre le fichier à traiter,
fais le traitement en plaçant le résultat dans un fichier temporaire et
remplace l'original par le temporaire
par exemple pour convertir tous les .txt dans un répertoire et ses sous-répertoires :
et conv.sh
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 find TARGET_DIR -name *.txt -exec conv.sh ISO-8859-1 UTF-8 {} \; rm /tmp/conv.tmp 2> /dev/null
(notez qu'il serait prudent de gérer les erreurs au cas où la conversion ne serait pas correcte… par exemple avec stat -f %z /tmp/conv.tmp pour tester la taille du fichier généré… - voir aussi l'option -c de iconv)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #!/bin/sh iconv -f "$1" -t "$2" "$3" > /tmp/conv.tmp cp -f /tmp/conv.tmp "$1"
Finalement, j'ai préféré me débrouiller avec un shell... en java (le beanshell, plus exactement). Cela te paraitra peut être surprenant, mais il est possible d'écrire un script shell unix en java, et comme je connais nettement mieux ce système...
Voici ce que j'ai écrit (remarque le #! magique de départ) :
Ce script lit la liste des fichiers à traduire sur l'entrée standard, et les traduit dans l'encodage désiré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 #! /bin/bash //bin/bash -c "exec java bsh.Interpreter $0 $1 $2";exit import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; scan = new Scanner(System.in); tmp = File.createTempFile("codeconv", "tmp"); tmp.deleteOnExit(); while (scan.hasNextLine()) { // lecture et transformation du fichier vers un temporaire nomfichier = scan.nextLine(); in = new File(nomfichier); inlength = in.length(); inf = new FileInputStream(in); ouf = new FileOutputStream(tmp); inc = inf.getChannel(); ouc = ouf.getChannel(); inmap = inc.map(FileChannel.MapMode.READ_ONLY, 0, inlength); codein = Charset.forName(bsh.args[0]).newDecoder(); cbin = codein.decode(inmap); codeout = Charset.forName(bsh.args[1]).newEncoder(); cout = codeout.encode(cbin); ouc.write(cout); inc.close(); ouc.close(); // remplacement de l'original par le nouveau tmp = new File(tmp.getCanonicalPath()); oufori = new FileOutputStream(in); inftmp = new FileInputStream(tmp); oucori = oufori.getChannel(); inctmp = inftmp.getChannel(); oucori.transferFrom(inctmp, 0, tmp.length()); oucori.close(); inctmp.close(); print("+ "+nomfichier+" fait."); }
Par exemple :
Ainsi je conserve la souplesse des commandes unix pour désigner des fichiers, et pour le traitement, je le fais avec ce que je sais utiliser. La commande file me confirme que l'encodage du fichier a bien changé.echo -e "Source1.java\nSource2.java" | codeconv.bsh ISO-8859-1 UTF-8
Et pour les améliorations, au moins, je serai nettement plus à l'aise !
Merci pour ton aide.
Arf, Koff, kofff
l'usine a gaz pour si peut ..........
je comprend mieux le besoin de puissance demusurée : un petrolier pour transporter un verre d'eau![]()
soit…Envoyé par gifffftane
mais vous n'avez pas tenu compte de la remarque
"notez qu'il serait prudent de gérer les erreurs au cas où la conversion ne serait pas correcte"
si le fichier source n'est pas converti correctement vous le remplacez quand même par le fichier temporaire… : attention à vos données originales…
dans votre cas, examinez la documentation de decode et encode et vérifiez ce qui se passe en cas d'échec de conversion…
Ah je vois que ceux qui se lèvent pour Danette sont toujours là, tant mieux pour eux.
Pour ce qui est de la gestion des erreurs, vous avez tout à fait raison. Mais comme on dit, It's a work in progress. D'autant qu'il y a de quoi s'inquieter, puisque j'efface le fichier d'origine ; je vais peut être modifier le code de façon à le sauvegarder d'une façon ou d'une autre, ou bien trouver le moyen de vérifier l'encodage d'origine (pour moi le principal risque est que je me trompe d'encodage d'origine)...
À bientôt.
Partager