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 :

Gérer et comparer des chaînes UTF-8 provenant de fichiers.


Sujet :

Langage C++

  1. #1
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut Gérer et comparer des chaînes UTF-8 provenant de fichiers.
    Bonsoir,

    Voilà la situation, j'ai en input un fichier texte délimité utilisant l'encodage utf-8. Mon algo doit le charger en mémoire et effectuer des comparaisons d'égalité entre les différentes chaînes afin de repérer des similarités de différents types.

    Mon gros problème, c'est de savoir comment je pourrai stocker ces chaînes en mémoire de façon à pouvoir dans un premier temps les découper puis ensuite les comparer.

    J'ai pensé au départ à utiliser des wstring et wchar_t simplement, mais d'après ce que j'ai appris, dans GCC c'est implémenté sous forme d'UCS-4 (4 bytes par caractères!) ce qui me semble très inefficace vu la quantité que je dois en gérer, sans parler des comparaisons...

    En fait vu que la valeur est sans grande importance et que seuls les bytes m'intéressent, j'ai pensé à utiliser de simple char[] contenant les octets bruts mais je ne sais pas trop comment ça va réagir lorsque j'enfilerai ça dans des boost::unordered_set (je sais pas si ça se hash tellement bien que ça).

    En fait je sais pas trop comment m'y prendre avec ces chaînes au format UTF-8, sachant que le code doit être portable linux et windows.

    Bref si vous avez des conseils, sachant que ça doit être assez efficace, je suis preneur.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Pourquoi ne pas convertir tout simplement ces chaînes vers autre chose que de l'UTF-8, par exemple de l'ISO-8859-1, afin de ne plus avoir à trop te préoccuper des caractères multi-octets ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Hello,

    Merci de la réponse. Mon algo doit être capable de gérer des caractères exotiques. Pour l'instant, après avoir pédalé dans la semoule un bon moment, j'ai choisi d'utiliser QT.

    Le fichier source peut être lu assez facilement et transformé à la volée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    QTextStream in(&file);
    in.setCodec( "UTF-8" );
     
    while (!in.atEnd())
    {
     
            QString line = in.readLine();
            ...
    }

    Les QString sont des chaînes unicode sur 2 octets qui possèdent un tas de fonctionnalités assez commode. Je doute que ce soit le meilleur choix possible mais ça me semble pas si mal comme compromis entre des raw char[] et du wstring.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Pourquoi tu n'utilises pas tout simplement std::string ?
    Tu lis tes données directement, et tu manipules ta chaîne en UTF-8. Utiliser QString n'apporte strictement rien. Dans les deux cas, le découpage et la comparaison ont les mêmes propriétés.
    Boost ftw

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Pourquoi tu n'utilises pas tout simplement std::string ?
    Tu lis tes données directement, et tu manipules ta chaîne en UTF-8.
    Bah il paraît qu'il y a un boost.unicode qui est déjà bien avancé

  6. #6
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Pourquoi tu n'utilises pas tout simplement std::string ?
    Tu lis tes données directement, et tu manipules ta chaîne en UTF-8. Utiliser QString n'apporte strictement rien. Dans les deux cas, le découpage et la comparaison ont les mêmes propriétés.
    Oui mais qu'est-ce que je fais des caractères sur plusieurs octets? Avec des QString je peux faire toutes les manipulations de texte (tokenization, regex) de façon sûre, tandis qu'avec un std::string, je suppose que la plupart des API ne tiendront pas du tout compte du fait que plusieurs chars peuvent en réalité ne représenter qu'un seul caractère.
    Je suis d'accord que dans mon énoncé c'est un problème qui figurait pas. Si ça avait été effectivement que des comparaisons à l'identique ça aurait suffit (y'aurait juste eu des trucs un peu moche en cas d'affichage à cause des caractères étendus). Mais il s'est avéré qu'au final j'ai utilisé un algo de stemming sur certains mots et c'est bien que je garde la liberté de pouvoir faire des opérations sur texte, et non seulement sur byte.

    Citation Envoyé par Alp
    Bah il paraît qu'il y a un boost.unicode qui est déjà bien avancé
    Juste mais sauf erreur, les librairies de boost qui concernent l'unicode utilisent des wchar_t. Donc des wstring, donc sous linux c'est vraiment gros. C'est ça qui m'inquiète.

  7. #7
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Je suis vraiment sidéré qu'en 2009 bien tassée ça reste encore si difficile d'utiliser Unicode en C++...
    Je ne suis pas expert en la matière mais Unicode c'est une norme qui a priori parait tout à fait remarquable avec son 'unification' des codes de toutes les langues et de tous les systèmes de symboles graphiques, qu'est-ce qu'on attend pour s'y mettre à fond et sans regrets...?

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Unicode, c'est déjà pas vraiment une norme, mais plusieurs. Alors laquelle ? UTF-8 ? UTF-16 ? UCS-2 ? UCS-4 ?

    Ensuite, c'est une norme qui est peut-être très bien en terme d'exaustivité, mais qui est assez coûteuse. Qu'on puisse toujours utiliser des alternatives me semble un bon point.

    Enfin, en C++, des bibliothèques existent pour gérer ça. Je crois que des choses sont prévues dans la prochaine version du langage, mais je n'ai pas trop suivi cette partie.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Je suis désolé Unicode est une norme qui possède trois implémentations (trois formes d'encodage) UTF-8, UTF-16 et UTF-32.

    Cela dit vu l'âge du C++ je trouve très surprenant que ces bibliothèques dont tu parles soient encore à venir... Je me demande si cela ne vient pas d'un certain manque de préoccupation pour le traitement des langues humaines dans leur diversité... Mais enfin bon nous sommes quelque peu hors sujet ici, je le confesse

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Avec des QString je peux faire toutes les manipulations de texte (tokenization, regex) de façon sûre, tandis qu'avec un std::string, je suppose que la plupart des API ne tiendront pas du tout compte du fait que plusieurs chars peuvent en réalité ne représenter qu'un seul caractère.
    Ça dépend vachement des manipulations en question en fait. La plupart vont simplement traiter les unités de 16 bits comme des caractères.

    Juste mais sauf erreur, les librairies de boost qui concernent l'unicode utilisent des wchar_t. Donc des wstring, donc sous linux c'est vraiment gros. C'est ça qui m'inquiète.
    En fait, je suis l'auteur de Boost.Unicode, et Alp me faisait de la pub.
    http://blogloufoque.free.fr/unicode/doc/html/

    Unicode est bien un standard. UTF-8, UTF-16 et UTF-32 ne sont que des encodages définis au sein de ce standard; il contient beaucoup d'autres choses.
    Boost ftw

  11. #11
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Citation Envoyé par loufoque Voir le message
    En fait, je suis l'auteur de Boost.Unicode, et Alp me faisait de la pub.
    http://blogloufoque.free.fr/unicode/doc/html/
    Impressionnant.
    Je ne pensais pas qu'on avait des contributeurs sur ce forum.

    Sinon pour ce qui est de l'unicode en c++, parmi les obstacles il y a peut être le fait que ça n'a jamais été le langage de choix pour faire des interfaces graphiques (enfin j'ai pas l'impression même si QT me surprend en bien) et des applications de gestion.
    Aussi, le type char n'a pas un typage très fort contrairement à d'autres langages ou il existe des types byte et char séparés. Je pense que ça soude assez solidement la conception 1 char = 1 byte.

  12. #12
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    @_skip
    Qt != QT

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par _skip Voir le message
    Aussi, le type char n'a pas un typage très fort contrairement à d'autres langages ou il existe des types byte et char séparés. Je pense que ça soude assez solidement la conception 1 char = 1 byte.
    Il ne me viendrait pas à l'idée d'utiliser un char (et encore moins un wchar_t) pour stocker un petit entier, tout comme il me me viendrait pas à l'idée d'utiliser un signed char ou un unsigned char pour y mettre un caractère.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  14. #14
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    tout comme il me me viendrait pas à l'idée d'utiliser un signed char ou un unsigned char pour y mettre un caractère.
    Non? C'est pourtant pas juste un héritage du C il me semble...

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par _skip Voir le message
    Non? C'est pourtant pas juste un héritage du C il me semble...
    Ce que voulais probablement dire JolyLoic c'est qu'on n'utilises pas un signed char ou un unsigned char pour stocker un caractère mais bel et bien un char (ou un wchar_t).

  16. #16
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Et ça me contredit ?
    J'ai du mal à croire que la conception char = byte = caractère existe que dans ma tête . Pour wchar_t, ok je discute pas mais sinon...

    Les fonctions de Qt censées manipuler des octets bruts (et pas du texte) utilisent des tableaux de char et non pas unsigned char. Donc soit je mélange tout, soit char porte quand même à confusion par sa polyvalence.

  17. #17
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est à mon sens une erreur de Qt d'avoir fait ainsi. Typiquement, quand je fais des entrées/sorties en binaire, j'utilise toujours des unsigned char. Ne serait-ce qu'a cause des surprises que le signe peut causer lorsque je je converti ces valeurs dans d'autres types.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Comparer des chaînes de caractères
    Par aurelie689 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 02/05/2009, 13h22
  2. [XL-2003] Découper des chaînes de caractère d'un fichier et les stocker dans un tableau
    Par -Naek- dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/04/2009, 18h24
  3. Manipulation des chaînes UTF-8
    Par Tchupacabra dans le forum Langage
    Réponses: 2
    Dernier message: 25/07/2007, 10h34
  4. Changer des chaînes de caractères dans un fichier
    Par troumad dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 10/11/2006, 08h45

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