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 POSIX Discussion :

[iconv] Script pour convertir projet entier en UTF-8


Sujet :

Shell et commandes POSIX

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 7
    Points
    7
    Par défaut [iconv] Script pour convertir projet entier en UTF-8
    Bonjour,

    J'ai un projet assez conséquent à convertir en UTF-8. Je suis sur Mac.

    Le projet initial est encodé est ISO-8859-1, toutefois, certains fichiers sont en US-ASCII par exemple.

    J'ai trouvé un script bash assez intéressant sur le net, utilisant iconv pour la conversion, mais je voudrais le personnaliser pour qu'il prenne en compte automatiquement l'encodage initial de chaque fichier.

    Le script initial :

    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
    #/bin/bash
    #
    # iconv-inplace.sh
    # Does recursive charset conversion using iconv
    #
    # Copyright (c) 2009 Onlime Webhosting, Philip Iezzi
    #                    http://www.onlime.ch
     
    ###### Configuration ######
    FROM_CHARSET="ISO-8859-1"
    TO_CHARSET="UTF-8"
    ###########################
     
    # Validate args
    STARTDIR="$1"
    if [ -z "$STARTDIR" ]
    then
        echo "Usage: $0 <directory>"
        echo "where: <directory> is the directory to start the recursive UTF-8 conversion."
        exit 1
    fi
     
    LIST=`find $1 -name "*.php"`
    for i in $LIST;
    do
        file -I $i;
        read -p "Convert $i (y/n)? "
        if [ "$REPLY" == "y" ]
        then
            iconv --from-code=$FROM_CHARSET --to-code=$TO_CHARSET $i > $i."utf8";
            mv $i."utf8" $i;
        fi
        echo "";
    done
    Ce script est une bonne base, mais le principal inconvénient est que l'encodage initial doit obligatoirement être définit dans le script (FROM_CHARSET="ISO-8859-1").

    Je souhaiterais savoir comment "détecter" automatiquement l'encodage du fichier initial, j'ai fait ça, mais ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    LIST=`find $1 -name "*.php"`
    for i in $LIST;
    do
        file -I $i;
        CONVERT_TO = `file --mime-encoding $i`
        read -p "Convert $i to $CONVERT_TO (y/n)? "
        if [ "$REPLY" == "y" ]
        then
            iconv --from-code=$FROM_CHARSET --to-code=$CONVERT_TO $i > $i."utf8";
            mv $i."utf8" $i;
        fi
        echo "";
    done
    En gros, à chaque itération je souhaite récupérer dans la variable CONVERT_TO l'encodage du fichier initial.
    Ainsi, dans la commande iconv, je remplace la variable "FROM_CHARSET" par "CONVERT_TO"...

    Seulement voilà, j'ai une erreur à l'éxecution du script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVER_TO: command not found
    Quelqu'un pourrait m'aider à ce sujet? j'imagine que la solution est assez simple mais vu que je suis débutant en BASH, j'ai du mal à trouver...

    Merci d'avance
    Simon

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <s>CONVERT_TO = `file --mime-encoding $i`</s>
    Il y a des espaces en trop autour du signe égale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT_TO=`file --mime-encoding $i`

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Bonjour et merci pour ta réponse,

    Effectivement c'est bien ça, comme quoi ça se joue à pas grand chose parfois...

    Une dernière question, la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file --mime-encoding /path/to/file
    retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /path/to/file: us-ascii
    Comment récupérer uniquement la partie us-ascii du résultat pour pouvoir utiliser la valeur dans iconv ?

    Encore merci!

  4. #4
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Quel système ?
    Quelle version de file ?

    As-tu regardé les options dans le "man file" ?

    Sinon tu peux te servir de l'expansion des paramètres si ton bash le permet..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo ${A}
    /path/to/file: us-ascii
    
    $ echo ${A#*: }
    us-ascii

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Parfait, c'est exactement ce que je souhaitais !

    Je suis sur Mac donc unix et la solution que tu m'as donné semble fonctionnée.

    Encore merci, je poste le script prochainement on sait jamais ça peut toujours servir ^^

    Merci!

  6. #6
    Membre actif Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 208
    Points
    208
    Par défaut
    Salut Aidona, cela serai sympa de poster ton script

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 12
    Points
    12
    Par défaut
    Avec quelques modifications, sur la meme base

    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
    #/bin/bash
    #
    # iconv-inplace.sh
    # Does recursive charset conversion using iconv
    #
    # Copyright (c) 2009 Onlime Webhosting, Philip Iezzi
    # <a href="http://www.onlime.ch" target="_blank">http://www.onlime.ch</a>
    #
    # source : <a href="http://www.developpez.net/forums/d1100462/systemes/autres-systemes/unix/shell-commandes-posix/bash-iconv-script-convertir-projet-entier-utf-8-mac-os-x/" target="_blank">http://www.developpez.net/forums/d11...tf-8-mac-os-x/</a>
     
    ###### Configuration ######
    TO_CHARSET="UTF-8"
    ###########################
     
    # Validate args
    STARTDIR="$1"
    if [ -z "$STARTDIR" ]
    then
        echo "Usage: $0 <directory>"
        echo "where: <directory> is the directory to start the recursive UTF-8 conversion."
        exit 1
    fi
     
    LIST=`find $1 -name *`
    for i in $LIST;
    do
            file -i $i;
            FROM_CHARSET=`file -bi $i | sed -e 's/.*[ ]charset=//'`
            iconv --from-code=$FROM_CHARSET --to-code=$TO_CHARSET $i > $i."utf8";
            mv $i."utf8" $i;
    done

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Bonjour.

    Bravo pour ce script!

    3 petites remarques:
    Lorsqu'un fichier ne comporte que des caractères ASCII (en gros, aucun caractère accentué), alors l'encodage détecté est US-ASCII. Sa conversion en UTF-8 ou ISO-8859-1 ne changera pas son contenu.

    Dans le script, il me semble qu'il faudrait convertir uniquement les fichiers de texte, notamment sauter les binaires, les répertoires et les liens.

    L'inconvénient d'utiliser une boucle 'for' sans changer IFS est qu'elle ne sait pas traiter les fichiers dont le nom comporte des espace, tabulation ou return.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 12
    Points
    12
    Par défaut
    voici une nouvelle version, un peu plus arrangée a ma sauce.
    J'ai aussi prit en compte les remarques de jack (merci pour le retour).
    - Exact pour les fichiers ne contenant pas d'accents, il n'y a pas de conversion.
    - J'ai changé le filtre sur les fichiers.
    - je pense que les fichiers avec des espaces devraient passer avec l'utilisation de quote autour de la variable.

    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
    #/bin/bash
    #
    # iconv-inplace.sh
    # Does recursive charset conversion using iconv
    #
    # Copyright (c) 2009 Onlime Webhosting, Philip Iezzi
    # <a href="http://www.onlime.ch" target="_blank">http://www.onlime.ch</a>
    #
    # source : http://www.developpez.net/forums/d1100462/systemes/autres-systemes/unix/shell-commandes-posix/bash-iconv-script-convertir-projet-entier-utf-8-mac-os-x/
     
    ###### Configuration ######
    TO_CHARSET="UTF-8"
     
    #If repertory exists
    STARTDIR="$1"
    if [ -z "$STARTDIR" ]
    then
        echo "Usage: $0 <directory>"
        echo "where: <directory> is the directory to start the recursive UTF-8 conversion."
        exit 1
    fi
     
    LIST=`find $1 -type f `
    for i in $LIST;
    do
            FROM_CHARSET=`file -bi "$i" | sed -e 's/.*[ ]charset=//'`
            if [ $FROM_CHARSET != "application/x-empty" ]
            then
     
                    iconv --from-code=$FROM_CHARSET --to-code=$TO_CHARSET "$i" > "$i"."utf8" 2>/dev/null
                    if [ $? -eq 0 ]
                    then
                            mv "$i"."utf8" "$i"
                            dos2unix -q "$i"
                    else
                            echo "ERROR on file `file -i \"$i\"`"
                    fi
            fi
    done

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par korrident Voir le message
    - je pense que les fichiers avec des espaces devraient passer avec l'utilisation de quote autour de la variable.
    non non.

    Dès que tu utilises 'for' sur le résultat d'un 'find', c'est foutu!
    Le contenu de $i est mauvais.

    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
    $ touch fichier\ avec\ espace
     
    $ ls -1
    fichier avec espace
    plop
     
    $ find . -type f
    ./fichier avec espace
    ./plop
     
    $ L=$(find . -type f)
     
    $ echo "$L"
    ./fichier avec espace
    ./plop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ for f in $L ; do echo "file: '$f'" ; done
    file: './fichier'
    file: 'avec'    # ici il voit plusieurs fichiers :(
    file: 'espace'
    file: './plop'
     
    $ for f in "$L" ; do echo "file: '$f'" ; done
    file: './fichier avec espace
    ./plop'    # il voit une seule ligne pour tous les fichiers :(

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 1
    Points : 3
    Points
    3
    Par défaut ma petite contribution
    Bonjour,

    Ayant moi même besoin de ce type de script, j'y ai apporté quelques modifications :
    • Je n'utilise plus find afin d'éviter le problème d'espace dans les noms de fichier
    • J'utilise simplement une boucle for in *
    • le for n'étant pas récursif, la récursivité est désormais réalisé par une fonction récursive
    • Affichage du répertoire parent d'un fichier dans les messages d'erreur
    • En cas d'erreur, suppression du fichier .utf8 éventuellement généré lors de la conversion


    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
    42
    43
    44
    45
    46
    47
    48
    #/bin/bash
    #
    # iconv-inplace.sh
    # Does recursive charset conversion using iconv
    #
    # Copyright (c) 2009 Onlime Webhosting, Philip Iezzi
    # <a href="http://www.onlime.ch" target="_blank">http://www.onlime.ch</a>
    #
    # source : http://www.developpez.net/forums/d1100462/systemes/autres-systemes/unix/shell-commandes-posix/bash-iconv-script-convertir-projet-entier-utf-8-mac-os-x/
     
    ###### Configuration ######
    TO_CHARSET="UTF-8"
     
    #If repertory exists
    STARTDIR="$1"
    if [ -z "$STARTDIR" ]
    then
        echo "Usage: $0 <directory>"
        echo "where: <directory> is the directory to start the recursive UTF-8 conversion."
        exit 1
    fi
    echo "Starting conversion"
     
    recursiveScan(){
      for i in *;
      do
            if test -f "$i"
            then
                    FROM_CHARSET=`file -bI "$i" | sed -e 's/.*[ ]charset=//'`
                    if [ "$FROM_CHARSET" != "binary" ]
                    then
                            iconv --from-code=$FROM_CHARSET --to-code=$TO_CHARSET "$i" > "$i"."utf8" 2>/dev/null
                            if [ $? -eq 0 ]
                            then
                                    mv "$i"."utf8" "$i"
                                    dos2unix -q "$i"
                            else
                                    echo "ERROR on file `file -I \"$i\"` in `pwd \"$i\"`"
                                    rm "$i"."utf8"
                            fi
                    fi
            elif test -d "$i"
            then
                    (cd $i; recursiveScan)
            fi
      done
    }
    (cd $1; recursiveScan)

Discussions similaires

  1. Script pour créer projet Eclipse
    Par yassirjanati dans le forum Eclipse
    Réponses: 1
    Dernier message: 22/09/2011, 18h28
  2. Problème pour convertir un entier en String
    Par K-you dans le forum C++
    Réponses: 13
    Dernier message: 15/04/2010, 18h19
  3. script pour convertir une table HTML en fichier CSV (ou excel)
    Par whitespirit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 20/08/2008, 09h30
  4. Quel script pour un projet de site de base de données de films ?
    Par jeremy_chauvel dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 13/11/2006, 15h00

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