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 :

[API C Python] Décoder une string python dans une appli C++


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut [API C Python] Décoder une string python dans une appli C++
    Bien le bonjour !

    J'ai un petit soucis à propos d'encodage. Voyez vous, j'ai une application qui fait de l'embedding Python. Cette application est faite en C++ avec les classes MFC, et celle ci fait appel à des script python. Dans ces script, mon application y récupère des chaînes de caractères, dont des avec des caractères spéciaux, tel qu'un 'é' ou un 'à'. Ces caractères, dans les script python sont traduits par des '\xe9', '\xc3' et autres joyeusetés lorsqu'encodés et placées dans une variable. Les script sont encodés en UTF-8 à l'enregistrement.

    Le soucis étant que lorsque je récupère ce genre de chaîne dans mon appli C++, avec PyString_AsString() par exemple, ces caractères ne sont ni des 'é' et 'à', ni même des '\xe9' et '\xc3' mais des '@%$' et similaires.

    Je me pose donc la question de comment faire pour que ces chaînes ne soient pas corrompu et réaliser au mieux le décodage pour avoir ma chaîne initiale.

    Merci à vous =)

  2. #2
    screetch
    Invité(e)
    Par défaut
    la chaine n'est pas corrompue mais encodée en UTF8
    mais le programme C++ l'interprète comme une châine C++, donc une chaîne ASCII, et les caractères inconnus sont interprétés selon l'encodage utilisé par windows (du CodePage 1250 ou une horreur similaire).

    Pour pouvoir utiliser ta chaîne, il faut soit la convertir dans un encodage correct (certaines fonctions windows existe pour faire ca et probablement l'API python peut le faire aussi pour toi) ou bien utiliser une bibliothèque capable d'utiliser l'UTF8 pour faire des traitements.

    Vu qu'a mon avis (je ne suis pas 100% sur) MFC ne comprend pas l'UTF8, tu pourrais utiliser a la place une bibliothèque qui le comprend, comme GTK+ ou Qt, ce qui te permettrait de garder de l'UTF-8 tout du long. Sinon a un moment il faudra faire la conversion UTF-8 0> encodage courant, pour l'afficher.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Merci de ta réponse !

    En testant diverses choses et en cherchant un peu partout j'ai compris un peu mieux le problème. En effet, mon appli MFC ne comprend pas l'UTF-8. Malheureusement pour moi, je ne peux pas utiliser une autre lib. Néanmoins, il est possible d'encoder les chaînes Python en CodePage 1252. En ayant testé sur le shell Python, le résultat est tout à fait concluant. Mais maintenant que ceci est possible, je n'arrive plus à utiliser mon script Python depuis mon appli MFC.

    Un beau bazar en somme, je sens que j'ai pas finis de bidouiller.

    Cette méthode semblant poser des soucis pour l'embedding Python, je vais plutôt essayer de faire la conversion dans l'appli MFC. Ca m'étonnait qu'il n'y ai pas un moyen, vu comme les MFC sont chipoteuses sur l'encodage.

    Merci à toi en tout cas, si quelqu'un a plus d'info, n'hésitez pas, je continue mon investigation =)

  4. #4
    screetch
    Invité(e)
    Par défaut
    MFC comprend surement les WideChar cependant (ce que Microsoft appelle UTF-16)
    la méthode MultiByteToWideChar peut transformer l'UTF-8 en UTF-16. A voir avec ca
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Salut salut !

    J'ai donc pu tester avec la méthode dont tu me parlais et après quelques bidouilles je m'en suis sortis. Merci beaucoup ! =)

    Au cas où, je vous indique ma solution, elle pourrait servir à d'autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Ceci est ma string récupérée dans un script python. Ici les "é" sont devenus des "é"
    sResult = PyString_AsString(PyList_GET_ITEM(pResult,0));
    char* sz =  new char [sResult.GetLength()+1] ;
    // Ici, on transforme la chaîne UNICODE en char* en gardant l'encodage de l'OS
    WideCharToMultiByte( CP_ACP, 0, sResult, -1, sz, sResult.GetLength()+1, NULL, NULL );
     
    int nSize=strlen(sz)+1;
    TCHAR *wsz= new TCHAR[nSize];
    // Pour finir, on décode la char* précédente comme si elle était en UTF-8
    MultiByteToWideChar( CP_UTF8, 0, sz,nSize,wsz,nSize);
    // Ma chaîne retrouve bien ses "é" =)
    CString strWideDup=wsz;

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    <plug type="shameless" who="me">
    <![CDATA[
    cet article, qui est censé faire la même chose mais en C++ standard (quoique avec l'internationalisation, on ne sait jamais...).
    ]]>
    </plug>

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/03/2011, 20h38
  2. Réponses: 10
    Dernier message: 07/04/2010, 21h14
  3. executer une instruction stockée dans une string
    Par tonnebrre dans le forum VB.NET
    Réponses: 4
    Dernier message: 01/04/2010, 00h23
  4. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  5. Executer une requete construite dans une string
    Par gael.mases dans le forum DB2
    Réponses: 3
    Dernier message: 31/10/2008, 09h46

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