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 :

printf et alignement en unicode


Sujet :

Shell et commandes GNU

  1. #1
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut printf et alignement en unicode
    Bonjour,

    j'essaye de traduire un programme en fr et j'ai des problèmes avec printf pour afficher des chaines dans un tableau

    impossible d'aligner, le tableau n'est plus aligné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    var='un ete'; printf "|%-8s| %s\n" "$var" "${#var}"
    var='un été'; printf "|%-8s| %s\n" "$var" "${#var}"
    var='un été'; LANG=C printf "|%-8s| %s\n" "$var" "${#var}"
    résultat dans console unicode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    |un ete  | 6
    |un été| 6
    |un été| 6
    $moi= ( !== ) ? : ;

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut,

    j'ai cherché ça bash length string unicode sur le web, et j'ai trouvé un article intéressant (tout en bas) chez stackoverflow.

    J'en ai tiré ça, je te laisse finir l'adaptation à ton cas particulier (et jette un œil à man wc, le mien ne connaissait pas l'option "-b"...)
    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
    #!/bin/bash
    MYSTRING="abc123"
    MYLENGTH=$(printf "%s" "$MYSTRING"|wc -c)
    echo $MYLENGTH
    MYSTRING="un ete"
    MYLENGTH=$(printf "%s" "$MYSTRING"|wc -c)
    echo $MYLENGTH
    MYSTRING="un été"
    MYLENGTH=$(printf "%s" "$MYSTRING"|wc -c)
    echo $MYLENGTH #8, les 5 autres à 6
    MYSTRING="abc123"
    MYLENGTH=$(printf "%s" "$MYSTRING"|wc -m)
    echo $MYLENGTH
    MYSTRING="un ete"
    MYLENGTH=$(printf "%s" "$MYSTRING"|wc -m)
    echo $MYLENGTH
    MYSTRING="un été"
    MYLENGTH=$(printf "%s" "$MYSTRING"|wc -m)
    echo $MYLENGTH
    Enjoy,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    merci j'avais en effet vu cette page mais je pensais a une solution "propre"

    Avec cette technique, oui ca marche ; mon résultat avec une fonction de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    printfunicode(){
        local txt="$1" size="$2"
        local b=$(echo "$txt" |wc -c)  # bytes
        local c=$(echo "$txt" |wc -m)  # chars
        sizereal=$((size+b-c))
        printf "| %-${sizereal}s | l:${#txt}, c:$c, b:$b, une cellule $size=$sizereal characteres!\n" "$txt"
    }
    printfunicode "un ete" 10
    printfunicode "un été" 10
    printfunicode "un eté" 10
    la sortie est enfin bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    | un ete     | l:6, c:7, b:7, une cellule 10=10 characteres!
    | un été     | l:6, c:7, b:9, une cellule 10=12 characteres!
    | un eté     | l:6, c:7, b:8, une cellule 10=11 characteres!
    mais, ca me parait fou qu'il faille ce "bricolage" pour bien aligner
    $moi= ( !== ) ? : ;

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par papajoker Voir le message
    mais, ca me parait fou qu'il faille ce "bricolage" pour bien aligner
    Moi non.

    De toute façon, s'il existait un outil, une commande qui fasse ce que tu veux en une syntaxe "propre" (ça me fait toujours rigoler quand je vois ça dans des discussions), dis-toi bien que dessous, ce que tu ne vois pas ferait les choses "salement".
    C'est intrinsèquement lié à l'Unicode et à sa faculté d'avoir un nombre de bits variable pour les caractères : à partir de là, faut bien bricoler, hein !

    Il n'y a rien de sale, il y a juste des choses efficaces et d'autres qui le sont moins.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    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 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,
    Voici une autre méthode (bidouille) en bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ var='un été'
    $ printf "|%-8s| %s\n" "$var" "${#var}"
    |un été| 6
    $ read -n 8 var <<<"$var        "  #<-- 8 espaces dans la chaine, comme ceci si $var est vide, on a quand même les 8 espaces
    $ printf "|%-8s| %s\n" "$var" "${#var}"
    |un été  | 8
    $ printf "|%s| %s\n" "$var" "${#var}"  # ou plus simplement
    |un été  | 8
    Cordialement.

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    voila , j'ai trouvé une autre solution qui me convient. voici le résultat de mes tests pour faire un "beau" tableau avec de l'unicode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    | un ete         | un éte         | un été         |    #printfunicode()
    | un éte         | un été         | un ete         |    #printfu()
    | un éte        | un été       | un ete         |    #printf()
    code source :
    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
    printfunicode(){
        local txt="$1" size="$2"
        local b=$(echo "$txt" |wc -c)  # bytes
        local c=$(echo "$txt" |wc -m)  # chars
        sizereal=$((size+b-c))
        printf "| %-${sizereal}s" "$txt"
    }
     
    printfu(){
        local vide='                                                                         '
        local txt="$1$vide" size="${2:-10}"
        printf "| %-${size}s" "${txt:0:$size}"
    }
     
      printfunicode "un ete" 15
      printfunicode "un éte" 15
      printfunicode "un été" 15
    echo "|"
      printfu "un éte" 15
      printfu "un été" 15
      printfu "un ete" 15
    echo "|"
      printf "| %-15s" "un éte"
      printf "| %-15s" "un été"
      printf "| %-15s" "un ete"
    echo "|"
    la solution "printfu()" est adoptée
    $moi= ( !== ) ? : ;

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Il me semble que simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var='un ete'; printf "|%-${#var}s| %s\n" "$var" "${#var}"
    var='un été'; printf "|%-${#var}s| %s\n" "$var" "${#var}"
    var='un été'; LANG=C printf "|%-${#var}s| %s\n" "$var" "${#var}"
    Cordialement,
    ctac

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

Discussions similaires

  1. [Pentium] Optimisation - Alignement
    Par Blustuff dans le forum Assembleur
    Réponses: 58
    Dernier message: 05/04/2003, 17h01
  2. JBuilder7 & JTable Colonne alignement
    Par Tonton Luc dans le forum JBuilder
    Réponses: 5
    Dernier message: 06/11/2002, 17h32
  3. [Datareport] Alignement
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/11/2002, 11h53
  4. [VB6] [Printer] Chiffres alignés à droite
    Par Laye dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 03/10/2002, 18h36
  5. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24

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