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 C++ Discussion :

[C++0x] UTF-8 std::string::length()


Sujet :

Langage C++

  1. #1
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut [C++0x] UTF-8 std::string::length()
    Bonjour,

    j'étais en train de lire : http://stackoverflow.com/questions/1...idered-harmful

    Et je me disais que le fait d'avoir une spécification pour les formats de caractères dans la nouvelle norme (UTF-8, UTF-16, UTF-32) allait pas mal aider si on utilise bien que l'UTF-8.

    Simplement je me demandais si std::string allait prendre en compte le format lorsqu'on utilise de l'UTF-8 pour nous retourner le nombre de charactères avec std::string::length() plutot que le nombre de bytes?

  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
    Non (etant donne le modele acturel, il faudrait mettre une locale dans chaque string pour le faire ou parametriser size() par la locale -- et en prime comme le nombre de byte est interessant, il faudrait une autre fonction pour avoir le nombre de byte).

    Il doit y avoir moyen d'ecrire une fonction libre faisant ce que tu veux (et prenant un parametre de type locale). Je sais l'interface des locale est a moitie incomprehensible et quasiment inutilisable (c'est pour ca que je ne donne pas un exemple). Pour la locale courante C, le plus simple est d'utiliser mbsrtowcs pour avoir la longueur.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Pour l'instant sous Linux, tout est en UTF-8.

    Si tu mets "ä é o" dans une std::string, il te renvoit une taille de 7. Mais ce n'est pas très génant si tu le sais.

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Justement je me disais qu'ils auraient ajouté une fonction ou n'importe quoi pour automatiquement se baser sur une locale pour avoir le nombre de charactères...

    Bon, dommage alors. Toutes les solutions pour gérer "facilement" l'utf8 semblent non-standards.

  5. #5
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Je relisais:

    Non (etant donne le modele acturel, il faudrait mettre une locale dans chaque string pour le faire ou parametriser size() par la locale -- et en prime comme le nombre de byte est interessant, il faudrait une autre fonction pour avoir le nombre de byte).
    Justement dans std::string il y a size() et length(), or length() est exactement (d'après le standard si je me souviens bien) size(); Aussi on pourrait avoir length() (avec un paramettre optionel de locale) pour avoir le nombre de charactères!
    Ok ça changerai le comportement et donc ne serait pas forcément rétro-compatible mais avoir les deux mots pour la même chose est pour le moins trompeur.

  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 Klaim Voir le message
    Justement dans std::string il y a size() et length(), or length() est exactement (d'après le standard si je me souviens bien) size(); Aussi on pourrait avoir length() (avec un paramettre optionel de locale) pour avoir le nombre de charactères!
    Ok ça changerai le comportement et donc ne serait pas forcément rétro-compatible mais avoir les deux mots pour la même chose est pour le moins trompeur.
    Historique. length() est le long datant de quand string existait dans la SL mais que la STL n'avait pas ete encore mise dedans. size() (et vraisemblablement d'autres membres) ont ete ajoutes pour rendre cette classe qui n'avait pas d'equivalent dans la STL compatible avec. Et par apres, la STL s'est mise a la fournir aussi.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Ok donc il faudrait vraiment soit une autre version de length() et size() qui soit paramettrée avec une locale, soit une fonction complètement différente.

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Non je ne pense pas.
    string est en fait un basic_string<char, char_traits<char>, allocator<char>>.
    Il suffit d'écrire un traits spécifique utf8, et de créer le type basic_string<char, utf8_traits<char>, allocator<char>>.
    "Yaka" comme qui dirait

  9. #9
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Sa suffirait a ce que size() et length() donnent le nombre de caractères? O__o

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Mieux, même, il suffit "tout simplement" de créer un typedef adéquat pour que cela marche...
    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
    27
    #include <string>
    #include <iostream>
    using namespace std;
    // ces symboles préprocesseurs permettent simplement de rendre
    // l'écriture plus aisée à la lecture :D
    #define UTF8_STRING(x) u8##x
     
    #define UTF16_STRING(x) u##x
     
    #define UTF32_STRING(x) U##x
    /* une chaine de caractères UTF-8 */
    typedef basic_string<char> UTF_8_String;
    /* une chaine de caractères UTF-16 */
    typedef basic_string<char16_t> UTF_16_String;
    /* une chaine de caractères UTF-32 */
    typedef  basic_string<char32_t> UTF_32_String;
     
    int main(int argc, char * argv[])
    {
        UTF_8_String value8(UTF8_STRING("ééé"));
        UTF_16_String value16(UTF16_STRING("aze"));
        UTF_32_String value32(UTF32_STRING("\u2018"));
        cout<<value8.size()<<endl
            <<value16.size()<<endl
            <<value32.size();
    	return 0;
    }
    affichage :
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il ne faut pas oublier qu'UTF-16 a certains avantages sur UTF-8:
    • Un code point prend au plus deux ?char, il est plus facile de coder avec cette assurance que sans.
    • Si l'on prend n'importe quel ?char d'une chaîne, on sait exactement où le code point commence et finit; ce qui n'est pas le cas en UTF-8.


    Avec cela, il est beaucoup plus facile de faire des traitements en UTF-16 qu'en UTF-8. Je ne nie pas qu'UTF-8 est un excellent format de stockage, mais il complique considérablement les traitements.

    En fait, ce qui manque à beaucoup de plate-formes, ce sont des fonctions de traitement et conversion en UTF-32. UTF-32 garantit un code point par ?char (mais pas un caractère par ?char pour autant, à cause des 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.

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

Discussions similaires

  1. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46
  2. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 11h37
  3. [JTABLE] taille dynamique = F°(String.length)
    Par tripop dans le forum Composants
    Réponses: 15
    Dernier message: 13/01/2005, 17h07
  4. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 12h07
  5. sql string length
    Par pedro226 dans le forum Bases de données
    Réponses: 9
    Dernier message: 05/05/2004, 10h43

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