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 confirm�
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    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
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    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
    Par d�faut
    <plug type="shameless" who="me">
    <![CDATA[
    O� cet article, qui est cens� faire la m�me chose mais en C++ standard (quoique avec l'internationalisation, on ne sait jamais...).
    ]]>
    </plug>
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

+ 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