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

C Discussion :

strlen et UTF-8


Sujet :

C

  1. #1
    Membre habitué Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 129
    Points
    129
    Par défaut strlen et UTF-8
    Bonjour,

    Je fais face à un problème suite à un passage d'un fichier en UTF-8. En effet je lis ce fichier ligne par ligne. Je stocke la ligne courante dans un char *, normal quoi. Sauf que depuis le passage à l'UTF-8 certains caractères sont multi-octets. Or strlen ne compte pas les caractères mais les octets. Du coup elle ne fait plus ce que je veux.

    J'ai trouvé un code censé fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mbstowcs(NULL, chaine ,0)
    Mais si j'ai un caractère UTF-8 dedans ('é' par exemple) je reçois -1, c'est-à-dire chaine invalide.

    Bref des idées ?

    Merci
    Tom

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Tu as bien change la locale?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 375
    Points : 41 543
    Points
    41 543
    Par défaut
    Que veux-tu compter exactement? Les code points, ou les caractères? Car si on prend en compte les accents décomposés, un caractère peut prendre plusieurs code points...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre habitué Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Tu as bien change la locale?
    env me donne :
    LC_ALL=fr_FR.UTF-8
    LANG=fr_FR.UTF-8

    file sur le fichier me donne :
    UTF-8 Unicode text

    Citation Envoyé par Médinoc
    Que veux-tu compter exactement? Les code points, ou les caractères? Car si on prend en compte les accents décomposés, un caractère peut prendre plusieurs code points...
    Euh je suppose que ce que t'appelle des code point c'est des octets. Non je veux bien compter les caractères. Genre 'é' est codé sur 2 octets mais je veux obtenir 1. Le problème c'est que strlen compte les octets, pas les caractères. D'ordinaire c'est pareil mais là pouff ça donne vite des bugs à 3 sous. :-)
    Tom

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 375
    Points : 41 543
    Points
    41 543
    Par défaut
    Citation Envoyé par Metal Tom Voir le message
    Euh je suppose que ce que t'appelle des code point c'est des octets. Non je veux bien compter les caractères. Genre 'é' est codé sur 2 octets mais je veux obtenir 1. Le problème c'est que strlen compte les octets, pas les caractères. D'ordinaire c'est pareil mais là pouff ça donne vite des bugs à 3 sous. :-)
    Non non, je parle bien des unicode code points. Vois-tu, 'é' peut aussi bien être codé sur un seul code point (U+00E9, codé sur deux char en UTF-8) que sur deux ('e' suivi de U+0301). Tu peux même avoir un caractère avec plusieurs accents!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Metal Tom Voir le message
    env me donne :
    LC_ALL=fr_FR.UTF-8
    LANG=fr_FR.UTF-8

    file sur le fichier me donne :
    UTF-8 Unicode text
    je parlais de ton programme (un appel a setlocale qqpart).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 375
    Points : 41 543
    Points
    41 543
    Par défaut
    En complément de mon précédent post: http://www.developpez.net/forums/d82...a/#post4726968

    PS: C'est pour quoi exactement? Pour la console?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre habitué Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Non non, je parle bien des unicode code points. Vois-tu, 'é' peut aussi bien être codé sur un seul code point (U+00E9, codé sur deux char en UTF-8) que sur deux ('e' suivi de U+0301). Tu peux même avoir un caractère avec plusieurs accents!
    OK. Dans tous les cas je veux que 'é' soit compté comme un seul caractère. Bref je que strlen("pépé") = 4, quelle que soit le codage.

    Citation Envoyé par Jean-Marc.Bourguet
    je parlais de ton programme (un appel a setlocale qqpart).
    Je ne l'ai pas appelé. J'imagine que le programme hérite de la valeur de l'environnement. Mais c'est vrai qu'en info on a toujours des surprises. Et puis c'est une appli cross-plateforme, elle compile pour Linux, Windows en Mac (en principe). Je sens que ça va foutre la merde ça encore.

    Citation Envoyé par Médinoc Voir le message
    PS: C'est pour quoi exactement? Pour la console?
    C'est du SDL + OpenGL. Pour faire vite c'est dans un système de gestion de fonte pour afficher du texte en OpenGL. Je lis une fichier contenant la description de ma fonte, en gros les caractères qu'il y a dedans. Donc je lis des chaines UTF-8, et j'ai besoin de savoir combien j'en ai lu. Mais je risque d'en avoir besoin ailleurs, donc je préfère rester sur le problème général.
    Tom

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Metal Tom Voir le message
    Je ne l'ai pas appelé. J'imagine que le programme hérite de la valeur de l'environnement. Mais c'est vrai qu'en info on a toujours des surprises. Et puis c'est une appli cross-plateforme, elle compile pour Linux, Windows en Mac (en principe). Je sens que ça va foutre la merde ça encore.
    Tant que ton programme n'appelle pas setlocale(), il utilise la locale "C" et pas celle definie dans l'environnement.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Membre habitué Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 129
    Points
    129
    Par défaut
    Il y a l'air d'avoir une solution dans le sujet voisin : http://www.developpez.net/forums/d82...utf-8-wchar_t/
    Tom

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    C'est normal, comme l'a fait remarqué Jean Marc Bourget:
    The behavior of the multibyte string functions is affected by the LC_CTYPE category of
    the current locale.
    et
    At program startup, the equivalent of
    setlocale(LC_ALL, "C");
    is executed.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

Discussions similaires

  1. Encodage de chaine -> UTF-8
    Par klarky88 dans le forum MFC
    Réponses: 2
    Dernier message: 26/05/2005, 18h13
  2. [io] UTF-8 et Eclipse
    Par michaelbob dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 25/05/2005, 10h27
  3. msXML compatible avec UTF-16
    Par cathar_rhythm dans le forum MFC
    Réponses: 1
    Dernier message: 23/05/2005, 15h42
  4. Mozilla & UTF-8
    Par SergioF dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 11/05/2004, 14h00
  5. [WebForms] Encodage, UTF-8 et accents
    Par alexischmit dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 28/04/2004, 12h21

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