IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Changer l'encodage de pleins de fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut Changer l'encodage de pleins de fichiers
    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 ?
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Citation Envoyé par gifffftane
    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 iconv

    iconv -f ISO-8859-1 -t UTF-8 filename.in > filename.out

  3. #3
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    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
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Citation Envoyé par gifffftane
    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…
    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 :
    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
    et conv.sh
    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"
    (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)

  5. #5
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    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) :
    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.");
    }
    Ce script lit la liste des fichiers à traduire sur l'entrée standard, et les traduit dans l'encodage désiré.

    Par exemple :
    echo -e "Source1.java\nSource2.java" | codeconv.bsh ISO-8859-1 UTF-8
    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é.

    Et pour les améliorations, au moins, je serai nettement plus à l'aise !

    Merci pour ton aide.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    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
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Citation Envoyé par gifffftane
    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é.



    Et pour les améliorations, au moins, je serai nettement plus à l'aise !

    Merci pour ton aide.
    soit…

    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…

  8. #8
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    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.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XStream] Changer l'encodage de fichiers Xml
    Par Jaynes dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 06/04/2011, 17h04
  2. find et vim pour changer l'encodage de milliers de fichier
    Par noooop dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/03/2009, 13h49
  3. Changer l'encodage du fichier (utf-8, iso, etc.)
    Par Dimitri01 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/04/2007, 09h02
  4. Réponses: 7
    Dernier message: 18/08/2006, 08h09
  5. Encodage de cd en fichier mp3
    Par clovis dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 08/04/2004, 01h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo