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 :

Récupération des accents après passage en UTF8


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Points : 26
    Points
    26
    Par défaut Récupération des accents après passage en UTF8
    Bonjour, ou bonsoir plutôt

    J'ai un soucis d'encodage des caractère.
    J'utilise un script de récupération de donnée qui formate les informations qu'il recupère en UTF8, conséquence, les accents sautent, certains caractères sont remplacés etc...

    Mes Locales sont en fr_FR.UTF-8, donc pas de soucis pour gérer les accents.

    Vu que ce qui est généré par le script (sur lequel je n'ai pas la main je précise), doit être comparé avec un environnement fr_FR.UTF-8 (avec accent), je voulais savoir s'il existait un moyen de remplacer les chaines genre "Septi\xc3\xa8me" par un joli "Septième" bien de chez nous ?

    J'ai essayé avec iconv en testant iso8859-1, iso8859-15, latin1, mais sans succès.

    Quelqu'un aurait il une idée?

    D'avance merci de votre aide

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par GorMsoN Voir le message
    Bonjour, ou bonsoir plutôt
    salut

    je voulais savoir s'il existait un moyen de remplacer les chaines genre "Septi\xc3\xa8me" par un joli "Septième" bien de chez nous ?
    il suffit - à priori - d'interpréter les caractères échappés, à travers echo -e typiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "Septi\xc3\xa8me"
    Septi\xc3\xa8me
    $ echo -e "Septi\xc3\xa8me"
    Septième

  3. #3
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Attention avec la solution utilisant la commande echo qui n'est pas standardisée et risque de ne pas fonctionner suivant le shell utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [ bash ] $ echo -e "Septi\xc3\xa8me"
    Septième
     
    [ zsh ] $ echo -e "Septi\xc3\xa8me"
    Septième
     
    [ mksh ] $ echo -e "Septi\xc3\xa8me"
    Septième
    Mais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [ dash ] $ echo -e "Septi\xc3\xa8me"
    -e Septi\xc3\xa8me
     
    [ ksh93 ] $ echo -e "Septi\xc3\xa8me"
    Septi\xc3\xa8me
    Mieux vaut utiliser printf qui est portable et donc fonctionnera quel que soit le shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ printf "Septi\xc3\xa8me\n"
    Septième
    ɹǝsn *sıɹɐlos*

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Helloooooo

    tout d'abord merci pour le retour, la simplicité de la commande me fait peut vis à vis du temps que j'ai passé à rechercher une solution sur le net...

    Bref,

    Mais du coup, il y a quelque chose que je ne pige pas.

    Lorsque je lance la commande avec une chaine de caractère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "une chaine de caractère avec des caractères genre \xc3\xa8 \n"
    j'obtiens bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    une chaine de caractère avec des caractères genre è
    Maintenant, j'ai un fichier avec un grand nombre de lignes contenant pour certaines des caractère comme ci dessus.
    du coup j'avais écris ce script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
     
    rm $1.new
     
    for i in $1
    do
     
       echo "$i"
       printf "$i\n" >> $1.new
     
    done
    le script me revois simplement le nom du fichier que je passe en paramètre...
    et dans le fichier créé en .new j'ai aussi 1 ligne avec unique le non du fichier passé en paramètre.

    Je précise que le fichier que je passe en paramètre comporte beaucoup de lignes...

    Du coup je comprends rien... l'est pourtant pas compliqué ce script

    D'avance merci de votre aide.

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Il faut lire chaque ligne du fichier, ton script fait une boucle (et une seule) qui traite le nom du fichier, pas son contenu..

    Voici comment on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    while IFS="" read -r i || [[ -n "$i" ]]; do
       printf "$i\n" 
    done < "$1" > "$1.new"
    ɹǝsn *sıɹɐlos*

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par GorMsoN Voir le message
    le script me revois simplement le nom du fichier que je passe en paramètre...
    oui, for i in $1 revient en gros à écrire for i in "fichier", ce qui est différent de for i in $(cat fichier)

    et puis on préfèrera une boucle while dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read -r line
    do
       printf "$line\n" >> ${fichier}.new
    done < $fichier
    • on utilise read -r de manière à conserver les backslashes pour printf ensuite (help read)
    • ${fichier} est la même chose que $fichier, simplement les accolades permettent de protéger le nom de variable et le dissocier de l'extension qu'on lui concatène, une bonne habitude juste

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    OLAAAAAA

    Bon après quelques essais ça ne fonctionnait toujours pas...
    du coup au lieu de prendre /bin/sh j'ai pris /bin/bash
    et là ooooh miracle ça fonctionne.
    Etrange si j'en crois un des commentaires plus haut qui annonçait que printf fonctionnait quelque soit le shell.

    Merci beaucoup à vous tous pour l'aide précieuse, malgré la simplicité de la solution, j'aurai pu chercher encore un bon moment.

    Mieux vaut 1 qui sait que 10 qui cherchent

    Du coup voici le code qui fonctionne pour replacer les caractères spéciaux à leur place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
     
    rm $1.new
     
    while read -r line
    do
            printf "$line\n" >> ${1}.new
    done < $1

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour

    Si le shebang n'est pas sur la première ligne il ne sert à rien.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    C'était juste lorsque j'ai copier-coller le code, j'ai corrigé ci dessus au cas où.

    Et je passe en résolu, j'avais oublié

  10. #10
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Il y a deux petits problèmes avec la solution que tu as retenue:

    - enlève les espaces éventuellement présent en debut ou en fin de ligne

    - ignore la dernière ligne si elle n'est pas terminée par un retour à la ligne (linefeed)

    D'autre part, il est inutile d'effacer le fichier de sortie puis de faire une redirection pour chaque ligne lue, une seule redirection en fin de boucle suffit.

    Je remet la solution que j'avais proposée qui ne présente pas ces limitations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    while IFS="" read -r i || [[ -n "$i" ]]; do
       printf "$i\n" 
    done < "$1" > "$1.new"

    Citation Envoyé par GorMsoN Voir le message
    Etrange si j'en crois un des commentaires plus haut qui annonçait que printf fonctionnait quelque soit le shell.
    Tu es sous quel Linux ?
    ɹǝsn *sıɹɐlos*

  11. #11
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    - enlève les espaces éventuellement présent en debut ou en fin de ligne
    - ignore la dernière ligne si elle n'est pas terminée par un retour à la ligne (linefeed)
    ah ben j'aurais appris un truc (deux en fait), effectivement vaut mieux utiliser ta solution pour le coup (la précédente c'est surtout qu'on s'est télescopé à 10min près )

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Je remet la solution que j'avais proposée qui ne présente pas ces limitations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    while IFS="" read -r i || [[ -n "$i" ]]; do
       printf "$i\n" 
    done < "$1" > "$1.new"
    Magnifique solution! Merci!

    Maintenant, si je puis me permettre une très très légère amélioration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    while IFS="" read -r line || [[ -n "${line}" ]]; do
       printf "${line}\n" 
    done < "$1" > "$1.new"


    PS: les variables nommées a b c d e f g h i j k l m n o p q r s t u v w x y z sont à éviter, voire interdites dans certaines conventions...

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,

    Je viens de voir le flot de réponse additionnel, je rajouterai la subtilité proposé avec l'IFS, quand c'est mieux ben c'est mieux

    Par contre au passage dans le genre cas à la con, parmi la liste des fichiers que je traite un petit matin a mis un "%" dans le titre
    si je résume le comportement

    Le fichier que je traite contient les deux lignes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /home/user/other/bla 200% sdfds sdfsfd
    /home/user/other/un_nom_de_dossier_normal
    avec la boucle dont on parlait j'arrive à ce résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ./user_report.sh: ligne 21 : printf: « H » : caractère de format non permis
    /home/user/other/bla 200/home/user/other/un_nom_de_dossier_normal
    en gros le % fait planter le bazar.... en perdant la fin de la ligne et en faisant sauter le "\n"
    au cas où... si quelqu'un a une idée propre plutôt que de faire un gros sed bourrin...

  14. #14
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Aie! Je n'avais pas pensé au "%". Tu as trouvé la faille de "printf" ...

    Pas de problème vu que tu fixes le shell avec "#!/bin/bash", tu peux utiliser "echo -e "...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    while IFS= read -r line || [[ -n "$line" ]]; do
       echo -e "${line}\n" 
    done < "$1" > "$1.new"
    ɹǝsn *sıɹɐlos*

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Bonjour,

    Toujours sous bash, on peut aussi utiliser printf en utilisant le formateur "%b", voici un exemple qui regroupe tous les cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo -n '    /home/user/other/bla 200% sdfds sdfsfd Septi\xc3\xa8me' | while read -r || [[ -n $REPLY ]]; do printf "%b\n" "$REPLY" ; done
        /home/user/other/bla 200% sdfds sdfsfd Septième
    En complément, ici j'utilise la variable par défaut de read (donc $REPLY) qui conserve aussi les espaces en début de ligne.

    PS: merci jlliagre pour le cas de la ligne incomplète.
    Cordialement.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    Merci pour les compléments de réponses apportées, et désolé pour mon temps de réponse, je suis papa depuis 1 semaine... et bizarrement j'ai moins de temps qu'avant lol.

    J'ai donc utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%b\n" "$variable"
    je n'ai juste pas utilisé $REPLY vu que cela générait des résultats bizarres.

    Merci encore pour toute l'aide apportée.

    A+

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Donc, Bienvenu au Nouveau PAPA et Bonnes nuits blanche à venir
    Cordialement.

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

Discussions similaires

  1. déreglement des tailles après passage en mde?!
    Par _MattU_ dans le forum IHM
    Réponses: 2
    Dernier message: 24/06/2008, 09h14
  2. Réponses: 1
    Dernier message: 17/06/2008, 12h02
  3. Récupération des données après restauration du système avec Ghost
    Par digital prophecy dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 12/06/2007, 14h05
  4. [jsp] - Récupération des accents
    Par karibouxe dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 06/07/2006, 16h17
  5. Réponses: 1
    Dernier message: 28/10/2005, 09h37

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