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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    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

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Tu as bien change la locale?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    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 éprouvé Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    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. :-)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    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
    Membre éprouvé Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    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.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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).

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    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.

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