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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    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 confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    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
    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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    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
    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"

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    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

+ 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, 10h14
  2. Réponses: 1
    Dernier message: 17/06/2008, 13h02
  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, 15h05
  4. [jsp] - Récupération des accents
    Par karibouxe dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 06/07/2006, 17h17
  5. Réponses: 1
    Dernier message: 28/10/2005, 10h37

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