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

Langage Perl Discussion :

Véritable longueur d'une chaine de caractères


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut Véritable longueur d'une chaine de caractères
    Bonjour à tous,

    Je suis un nouveau membre depuis ce jour et je trouve ce site génial.

    Certains vont dire que je voudrais courir avant d'apprendre à marcher, mais bon... voici mon problème, j'ai constaté qu' en voulant connaître la longueur d'une chaine de caractères, "length($str)" la réponse varie en fonction de la présence de caractères accentués ou non. Il semble que perl interprète un "é" comme deux caractères. Comment puis-je trouver l'astuce pour que cette fonction me donne le nombre correct?
    Excusez-moi la réponse se trouve probablement dans une de vos documentations ou dans un de vos forums mais je dois avouer que votre site regorge trop d'informations pour être lues en un jour. Je me débrouille pas encore très biens avec vos moteurs de recherches, avec vos tutoriels, facs et autres.
    merci d'avance et à +

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est un peu plus compliqué que ça. length te donne toujours la longueur exacte de la chaîne, mais quelle chaîne ?
    Est-ce qu'une string est une liste d'octet, ou une liste de caractères, et s'il s'agit de caractères, dans quel encodage ?
    Tout était plus simple quand les encodages étaient en 8 bits, mais de nos jour, l'unicode envahi le monde, et pire l'utf-8 envahi le monde. Or en UTF-8 tous les caractères n'ont pas la même longueur, entre autres les caractères accentués français prennent deux octets. Si tu veux que length te donne le nombre de caractères de ta chaîne il faut donc déjà que Perl sache qu'elle est encodée en utf-8. Selon l'origine de ta chaîne, cela va se faire de différentes façon. Par exemple si ton script lui-même est écrit en utf-8 et que ta chaîne est une constante (ou une concaténation de constantes), il faut que tu mettes "use utf8;" au début de ton script pour que Perl sache que ton script est en utf8 (tu pourras même utiliser des caractères unicode dans tes identifieurs dans ce cas). Si la chaîne vient d'un fichier en utf8, il faut l'indiquer à l'ouverture du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open my($file), '<:utf8', $filename
      or die "Can't open $filename : $!\n";
    --
    Jedaï

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Merci Jedai,
    en utilisant "use utf8;" en début de mon script, cela fonctionne. Perl calcule le nombre de caractères corrects. Cela me permet d'aligner à droite certains de mes données dans mon fichier .txt de sortie. En revanche (mais ceci est peut-être hors sujet), les accents utilisés dans mes messages envoyés à mon terminal print"messages"; sont remplacés par d'horribles caractères. Je me suis rendu dans l'onglet "profil" de mon terminal linux et je n'ai rien vu pour modifier cette erreur.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    In fine, j'ai utilisé "ISO 8859 15" et cela fonctionne....

    Merci

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par danyII Voir le message
    Merci Jedai,
    en utilisant "use utf8;" en début de mon script, cela fonctionne. Perl calcule le nombre de caractères corrects. Cela me permet d'aligner à droite certains de mes données dans mon fichier .txt de sortie. En revanche (mais ceci est peut-être hors sujet), les accents utilisés dans mes messages envoyés à mon terminal print"messages"; sont remplacés par d'horribles caractères. Je me suis rendu dans l'onglet "profil" de mon terminal linux et je n'ai rien vu pour modifier cette erreur.
    C'est probablement parce que ton terminal est en utf8 mais que Perl ne le sait pas, il faut lui dire avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    binmode STDOUT, ':utf8';
    (ou utiliser le pragma 'open', c'est probablement plus propre)

    Avant ça marchait parce que Perl ne savait pas que ton terminal était en utf8 mais il ne savait pas non plus que ta string était en utf8, il la recopiait donc octet par octet vers la sortie, et comme ta string était en fait en utf8, ça sortait le bon truc. Mais à partir du moment où il sait que ta string est en utf8 et qu'il croit que le terminal est en ISO-8859-15, il essaie de traduire et ça fait un grand n'importe quoi...
    (y a aussi la possibilité que ton terminal soit vraiment en ISO-8859-15 mais que Perl croit qu'il est dans un autre encodage 8 bit ou peut-être que ...)

    Les problèmes d'encodage c'est l'enfer sur terre à mon avis.

    --
    Jedaï

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Super cela fonctionne en utf8

    Merci à toi Ô maître

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/05/2015, 16h16
  2. Réponses: 7
    Dernier message: 27/11/2010, 18h10
  3. Réponses: 3
    Dernier message: 11/10/2010, 16h54
  4. vérification de la longueur d'une chaine de caractère
    Par midodido123 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 04/08/2009, 10h24
  5. [TRANSACT SQL] longueur d'une chaine de caractères
    Par Cyborg289 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/03/2007, 08h06

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