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 :

convertir wchar_t en wstring


Sujet :

C++

  1. #1
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut convertir wchar_t en wstring
    J'ai l'impression d'enfoncer une porte ouverte, mais je n'ai rien trouvé d'explicite
    sur les conversions entre les différents type de chaine unicodes
    J'ai une application qui récupère un nom de fichier en wchar_t et un module qui ouvre les fichiers et demande un type wstring, et borland c++ 6.0 me dit que le transcodage n'est pas autorisé.
    Qui peut m'aider à retrouver ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour et bienvenu,
    Normalement, on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef basic_string<wchar_t> wstring;
    . Donc tu ne devrais pas avoir à convertir ! Que dit le compilateur?

  3. #3
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Resultat de compilation après l'introduction du typdef
    Merci pour cette réponse rapide
    Il y a un changement dans les erreurs de compilation mais le même nombre d'erreurs
    ci joint:


    [C++ Erreur] DllMain.cpp(41): E2285 Impossible de trouver une correspondance pour '_STL::wstring::basic_string(wchar_t)'
    [C++ Erreur] DllMain.cpp(41): E2031 Impossible de transtyper de 'wchar_t' en '_STL::wstring'

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Il doit te manquer un flag de compil pour utiliser la STL avec wchar_t. Je ne connais pas borland c++ 6.0 et la version de la STL qu'il utilise, donc je ne peux te dire lequel. En général, jette un coup d'œil aux fichiers d'en-tête, celui-ci devrait t'apparaitre rapidement.

  5. #5
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut C'est bon...pour ce coup ci
    Je remercie bien ceux qui m'ont aidé
    et pour ceux qui ont besoin de la solution...
    C'est un peu touchy au niveau de la syntaxe
    Mais c'est comme le chef l'a dit.... des plus simple

    dans l'en tête du fichier je met le typedef:
    typedef basic_string<wchar_t> wstring;

    dans les variables de ma fonction je déclare ma variable pour le path:

    std::wstring WordFile;

    puis dans le début du code, j'affecte ma variable

    WordFile = FileName;

    et après j'ai mon path dans WordFile que je transmet à la fonction suivante
    et le compilateur est content
    Je reviendrai vous dire si c'est bon à l'exécution
    Il faut que je clic sur résolu... je ne sais pas encore le faire

  6. #6
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Salut,
    Je ne pense pas que ta solution en soit une. Avec ton typedef, tu redéfinis un type qui est sensé exister.
    C'est une bidouille qui contourne le problème dans ce cas précis (donc déjà pas génial), mais je mets ma main à couper que tu rencontreras d'autres problèmes.
    Le mieux reste de vérifier comment la STL est prise en charge dans ton compilateur.
    Bon courage.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Spout Voir le message
    Salut,
    Je ne pense pas que ta solution en soit une. Avec ton typedef, tu redéfinis un type qui est sensé exister.
    C'est une bidouille qui contourne le problème dans ce cas précis (donc déjà pas génial), mais je mets ma main à couper que tu rencontreras d'autres problèmes.
    Le mieux reste de vérifier comment la STL est prise en charge dans ton compilateur.
    Bon courage.
    Je partage cet avis. Comme indiqué plus haut, il doit te manquer un flag de compil pour intégrer l'unicode à la STL.

  8. #8
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut La solution définitive validée
    Bonjour

    D'abord un grand merci pour toute l'aide que vous m'avez apporté. Tout ce que vous m'avez dit était utile

    J'ai un peu tardé à répondre, car j'ai voulu aller au bout des vérifications.
    En conclusion et pour bien documenter de problème dont j'ai vu beaucoup de messages sur le web. Je me propose de décrire mon sujet et l'emploi que j'ai fait des différentes aides que j'ai retiré de cette demande et qui me rend très ce soir ou tout a été vérifié.

    Je reprend des différents outils dans le domaine du langage naturel:
    Un dictionnaire écrit en C et converti en C++ implanté dans une DLL qui ne parle que char;
    Un outil de traduction qui parle UNICODE en wstring;
    Je suis donc concerné à tous les échanges par les transcodages entre wstring et char. J'ai vite compris qu'il fallait passer par les wchar_t.
    J'a

  9. #9
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Résultat après vérification
    D'abord je remercie tous les contributeurs qui m'ont permis de résoudre mes problèmes
    Ensuite leur dire que toutes les contributions qu'ils m'ont apporté on été positives
    Enfin je pense que ce sujet est partiellement documenté sur le net et que j'ai maintenant une solution complète faite à partire de ces contributions et d'une autre qui a considérablement aidé sur les transcodages Wchar_t a char de http://www.developpez.net/forums/u72598/medinoc/
    ensuite je dois dire que j'ai découvert le besoin qu'avait borland de préfixer tous les déclarations de wstring par std::wstring
    Le typdef n'est bien entendu pas utile
    Je documente donc la solution et joint le fichier résultat quis est assez modéré et qui comprend tous les transcodages
    Fichiers attachés Fichiers attachés

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par JeanNoel53 Voir le message
    les transcodages Wchar_t a char
    Ah! ton premier post parlait de transformation wchar_t/wstring ce qui en l'occurrence est assez différent. Nos réponses n'ont pas donc pu être complète
    Mais, bon, tu as su fouiller dans le site pour trouver ta réponse
    C'est l'essentiel !

  11. #11
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Merci
    Bine entendu quand j'ai posé la question j'avais déjà les autres parties des réponses, et je ne poses pas de question dont je n'ai pas cherché la réponse avant. J'ai mis la synthèse car j'ai observé que beaucoup de gens manque du contexte d'emploi.
    à+

  12. #12
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Ce n'est pas fini
    Citation Envoyé par JeanNoel53 Voir le message
    Je remercie bien ceux qui m'ont aidé
    et pour ceux qui ont besoin de la solution...
    C'est un peu touchy au niveau de la syntaxe
    Mais c'est comme le chef l'a dit.... des plus simple

    dans l'en tête du fichier je met le typedef:
    typedef basic_string<wchar_t> wstring;

    dans les variables de ma fonction je déclare ma variable pour le path:

    std::wstring WordFile;

    puis dans le début du code, j'affecte ma variable

    WordFile = FileName;

    et après j'ai mon path dans WordFile que je transmet à la fonction suivante
    et le compilateur est content
    Je reviendrai vous dire si c'est bon à l'exécution
    Il faut que je clic sur résolu... je ne sais pas encore le faire

  13. #13
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Instabilité de l'implémentaion
    J'ai testé la solution proposés dans une DLL que j'ai mis dans mon précédent message. Elle marche bien
    Pour des raisons opérationnelles, j'ai choisi d'implanter dans une même DLL le code du dictionnaire et le code du lecteur Word. et là ca ne marche plus de la même façon. et le résultat fait planter l'ouverture du fichier Word.
    Je n'ai rien trouvé sur ce sujet. Je vous recopie ci-après les traces du debugger pour expliquer ma question.
    voici d'abord le code tel que je l'ai modifié
    J'ai d'abod déclaré le Word File en static et comme pointeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static wstring *WordFile;
    Puis j'ai un recours à une allocation mémoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      IsAllocated = false;
      NormFile = ambstowcs( FileName);    // alloue un bloc de wchar_t 
      WordFile = new wstring( NormFile );
    et j'ai toujours le même résultat après la conversion
    Je trouve dans WordFile la valeur suivante:
    M_start = :00B47F9C "D:\\usr\\Thèse\\Tailgate\\Spx\\TailgateQuituplets.doc"
    M_finish = :00B47FFC ""
    et
    M_end_of_storage ={"x8000"}

    or dans la première implémentation j'avais M_end_of_storage = {""}

    C'est la seule différence entre les deux implémentations la première retourne un succès d'ouverture du fichier en deux instructions dans string.c La deuxième effectue 75 instructions+ dans le code de la stl, examine avec attention l'allocator et se plante dans la stl avec EAccessViolation avec le message Violation d'adresse à l'adresse 484B8B lecture de l'adresse 00000048
    Je ne sais pas comment mettre l'allocator a NULL
    Merci d'avance pour votre aide sur ce pb un peu inhabituel

  14. #14
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Une solution plus stable
    Bonjour

    Compte tenu de l'instabilité observé, j'ai finalement ajouté deux appels à des propriétés wstring pour arriver à une solution stable.

    La chaine finale est déclarée en statique comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static wstring WordFile;
    Et le code validé comprend ces 4 instructions, qui modifient le source livré dans la version précédente.
    FileName est un char*
    NormFile est un wchar_T*
    len est un int

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      // on démarre an ascii
      len=strlen(FileName);// on récupère le nombre de caractères de la chaine
      NormFile = ambstowcs( FileName);    // fonction dans le précédent code
      // on est en unicode wchar_t 
      WordFile.reserve(len); // on réserve exactement le bon nombre d'unicode
      WordFile.assign(NormFile); // et on assigne la valeur de la chaine
      //on est en wstring
    et ca marche,
    c'est stable dans toutes les implémentations
    C++ builder réserve encore d'autre instabilités... à suivre

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

Discussions similaires

  1. Convertir des wchar_t en byte (unsigned char)
    Par teddyalbina dans le forum Langage
    Réponses: 4
    Dernier message: 15/07/2011, 11h26
  2. Réponses: 3
    Dernier message: 18/06/2009, 18h30
  3. Réponses: 5
    Dernier message: 05/09/2008, 17h26
  4. Convertir wstring en char
    Par Contrec dans le forum C++
    Réponses: 16
    Dernier message: 07/08/2008, 17h54
  5. Convertir QString en wchar_t*
    Par jerome71300 dans le forum Débuter
    Réponses: 4
    Dernier message: 09/04/2008, 10h14

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