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 :

String qui contient de l'UTF16


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut String qui contient de l'UTF16
    Salut tout le monde,
    J'ai une string qui contient une chaîne compressée.
    J'utilise zlib pour la décompresser, mais zlib me renvoie une chaîne qui n'est pas un wstring.
    En conséquence, j'obtiens un XML codé en UTF16 dans un string...
    Comment puis-je convertir ma chaîne en chaîne string "lisible" (UTF8)? Le résultat en c++ type de chaîne est: \0<\0\0X\0M\0L ..... Ce qui ressemble vraiment à un wstring ...

    J'ai cherché pendant un bout de temps sur google, mais je n'ai pas trouvé comment faire ...

    Merci par avance,

    (suite de ce travail, je changerais des informations dans le XML, puis je devrais le recoder en UTF16 pour ensuite le recompresser avec la zlib ... )

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Bon voilà ce que je comprends :
    Peu importe que ton buffer soit passé par la ZLIB ou autre : le fait est que tu as un buffer XML codé apparemment en utf-16.

    Première question, toute bête : si ton fichier xml a bien une entête qui précise l'encodage comme étant du utf16, alors est-ce que ta librairie XML ne le supporterait pas d'emblée ? ça t'éviterait d'avoir à faire une conversion.

    En admettant que ce ne soit pas le cas, il existe un tas de librairies qui font très bien la conversion utf-16 vers utf-8. Par exemple, sous Win32 j'utilise WideCharToMultiByte() (voir la doc MSDN).

  3. #3
    Membre très actif
    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
    Par défaut
    A noter que le C++11 permet des std::string en UTF-16.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Si tu es sur une plate-forme où les wchar_t sont en UTF-16 (comme Windows), tu devrais pouvoir faire ceci pour au moins obtenir une wstring:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const wchar_t * pcw = reinterpret_cast< const wchar_t * >(maString.c_str());
    wstring maWString(pcw, 0, maString.length()/2);
    Ensuite, tu devrais pouvoir utiliser les vraies fonctions de conversion.
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    Bon voilà ce que je comprends :
    Peu importe que ton buffer soit passé par la ZLIB ou autre : le fait est que tu as un buffer XML codé apparemment en utf-16.

    Première question, toute bête : si ton fichier xml a bien une entête qui précise l'encodage comme étant du utf16, alors est-ce que ta librairie XML ne le supporterait pas d'emblée ? ça t'éviterait d'avoir à faire une conversion.

    En admettant que ce ne soit pas le cas, il existe un tas de librairies qui font très bien la conversion utf-16 vers utf-8. Par exemple, sous Win32 j'utilise WideCharToMultiByte() (voir la doc MSDN).
    Merci pour cette info, oui je prends seulement le temps de répondre, grosse charge de travail
    Alors voici la réponse pour ceux que ça intéresserait plus tard :

    J'utilise la Zlib et j'obtiens de l'utf 16 dans une string, je fais ensuite tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        // récupération de la taille de la chaine
        int size = cstr.size();
        wchar_t *wcStr = (wchar_t*)malloc(size);
        // Je copie la chaine de caractères dans wcStr
        memcpy(wcStr, cstr.c_str(), size);
        char* cBUFFER_OK  = convertUnicodeToWinString(wcStr , size*4);
        cout << cBUFFER_OK << endl;
    Et voilà, tout fonctionne !
    La méthode convertUnicodeToWinString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char* convertUnicodeToWinString(wchar_t*str, int length)
    {
        char* rtn = (char*)malloc( length*2+1 );
        int size = 0;
     
        size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)str, length, rtn, (length*2+1), NULL, NULL );
     
        if( size <= 0 )
            return NULL;
     
        rtn[size] = 0;
        return rtn;
    }

    Il suffisait de copier simplement le contenu de la chaine dans un wchar_t avec un memcpy...

    Merci à vous !

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Il y a une fuite mémoire si size <= 0
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    De plus, pourquoi utiliser arbitrairement length*2+1 quand la méthode recommandée est d'appeler d'abord WideCharToMultiByte() (ou wcstombs(), wcstombs_s(), etc.) avec un buffer NULL pour obtenir la taille nécessaire?
    Et pourquoi ce cast explicite de wchar_t* en LPCWSTR? Surtout un cast C-style, alors que tu programmes en C++!
    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 averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut
    Très bonne question, hé bien je dois avouer avoir tellement galérer avec mes essais que quand je suis tombé sur le résultat voulu je me suis arrêté là, tout simplement...

    Il faudrait que je refasse tout ça "au propre" pour donner un code certainement plus utilisable pour tout le monde !

    Merci pour ta remarque

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

Discussions similaires

  1. Incrémenter un string qui contient un entier
    Par itokia dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/06/2011, 11h56
  2. [XML] Creer un string qui contient du XML
    Par Hightuxdotnet dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 29/01/2009, 13h07
  3. c:out avec une string qui contient du html
    Par MooGle dans le forum Struts 1
    Réponses: 2
    Dernier message: 28/08/2007, 14h45
  4. [VS2005][C#] Sélection Item qui contient une string
    Par olivier_23 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 26/07/2006, 10h56
  5. [C#] DataGrid qui contient un lien vers une page
    Par Roach dans le forum ASP.NET
    Réponses: 6
    Dernier message: 19/08/2005, 13h54

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