octobre
2009
Comme beaucoup avant moi, j’ai rencontré des problèmes d’encodage de fichier suite à l’utilisation conjointe de Windows et Linux.
Avant cela, je ne faisais vraiment pas attention à l’encodage et mon IDE encodait tous mes fichiers en windows-1252.
Une fois mon serveur Linux monté, je me retrouvais donc avec des fichiers illisibles.
Après quelques recherches, j’ai trouvé (on m’y a aidé ) un utilitaire Windows en ligne de commande permettant de convertir un fichier d’un format à un autre, iconv. Qui s’utilise de manière assez simple :
iconv -f windows-1252 -t UTF-8 file_src
Néanmoins, on est obligé de passer par un fichier temporaire car cette commande retourne sur la sortie standard le contenu encodé. Il faut donc détourner la sortie standard vers un nouveau fichier puis écraser l’ancien fichier avec le nouveau.
Mais c’est très facile à généraliser et à utiliser de manière récursive sur un dossier. Personellement, je l’ai réalisé en Java, mais c’est facilement faisable dans n’importe quel langage de programmation.
Voici ce que j’ai développé en Java pour réaliser ce traitement :
import java.io.IOException;
public class Converter {
private static String src = "WINDOWS-1252";
private static String dest = "UTF-8";
public static void main(String[] args) {
if(args.length > 2){
src = args[2];
}
if(args.length > 1){
dest = args[1];
}
if(args.length > 0){
String folder = args[0];
convertFolder(new File(folder));
} else {
System.out.println("Not enough arguments !");
System.out.println("Usage : Converter folder_path [encoding_dest] [encoding_src]");
System.exit(-1);
}
}
private static void convertFolder(File folder) {
for(File f : folder.listFiles()){
if(f.isFile()){
convertFile(f);
} else if(f.isDirectory()){
convertFolder(f);
}
}
}
private static void convertFile(File f) {
try {
File converted = new File(f.getAbsolutePath() + ".encoded");
String cmd = "iconv -f " + src + " -t " + dest + " \"" + f.getAbsolutePath() + "\" > \"" + converted.getAbsolutePath() + "\"";
Runtime runtime = Runtime.getRuntime();
String[] args = { "cmd.exe", "/C", cmd};
runtime.exec(args).waitFor();
if(converted.exists()){
f.delete();
converted.renameTo(f);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Le code n’a rien d’optimal du tout, mais il est fonctionnel pour ce besoin, mais la gestion des erreurs est déplorable mais suffisante pour un programme a utiliser peu de fois
6 Commentaires + Ajouter un commentaire
Archives
- novembre 2011
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- juillet 2009
- juin 2009
- avril 2009
- mars 2009
- février 2009
- octobre 2008
- septembre 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
Catégories
- AMD
- Apple
- Cartes graphiques
- Chrome
- Conception
- Divers
- Eclipse
- English
- Hardware
- Informatique générale
- Intégration continue
- IntelliJ Idea
- Java
- JTheque
- Linux
- Logiciels
- Mes articles
- Mes critiques de livres
- Mes projets
- Microsoft
- Mon serveur perso
- Office 2007
- Open Source
- Outils
- Perso
- PHP
- Processeurs
- Programmation
- Sécurité
- Spring
- Windows Vista
- Windows XP
Petite note : Il faut veiller à exclure les images
J’ai réussi à corrompre toutes les images de mon projet en utilisant ça à la brute…
@benwit : Non, non, c’est un tout nouvel encodage qui se veut très pratique :aie:
C’est corrigé, merci
ça serait pas plutôt :
private static String dest = « UTF-8″;
PS : ce commentaire peut être retirer »
Voilà, j’ai ajouté le code. Il nécessite que iconv soit installé et utilisable directement sur la ligne de commande.
Je peux te dire que maintenant j’ai reconfiguré tous mes outils pour qu’ils utilisent UTF-8 ^^
Je vais 2-3 refactorings sur le code et je le publie sur le billet
Dans éclipse, j’ai pris l’habitude de mettre tous les fichiers en UTF-8. Cela évite pas mal de problème par la suite.
A noter que les ressources bundle sont en Iso et qu’il faut donc faire la conversion par soi-même.
Pour ton code Java, il pourrait être intéressant que tu le partages.