PB: Fonction de conversion Unicode->char

PB: Fonction de conversion Unicode->char - C++ - Programmation

Marsh Posté le 01-08-2005 à 12:04:51    

Salut , j'ai fait une petite fonction de conversion des caractres unicode vers du char*.
Hors parfois il me sort n'importe quoi.
 
Voici un exemple de ce qu'il me sort:
laille: 11 ecris: @pð  
taille: 9 ecris: 127.0.0.1ont  
 
au lieu de  
taille: 11 ecris: /WaterWorld
taille: 9 ecris: 127.0.0.1
 
En fait je me sert de cela dans un jeu que je fait avec Irrlitch qui pour être un max portable utilise l'Unicode pour les guis.
Donc en gros on a dans Irrlitch des    "const wchar_t machin" que je veux transformer en "char* truc" pour faire mes connection socket et lancer une map.
 
voici le code:
 

Code :
  1. char* Menu :: wchar_t_to_char(const wchar_t* wc){
  2.   if(wc!=NULL){
  3.     int i;
  4.     char* lwc = (char*) malloc(wcslen(wc));
  5.     i = wcstombs(lwc, wc, wcslen(wc));
  6.     cout <<"taille: " <<wcslen(wc) << " ecris: " << lwc << endl;
  7.     return lwc;
  8.   }
  9.   return "error\0";     
  10. }


 
que j'appel comme cela:
 

Code :
  1. char* Menu::getMap(){
  2.   return (char*)wchar_t_to_char(current_map);
  3. }


et current_map c'est "const wchar_t* current_map = L"/WaterWorld" "
 
explication des foncions: wcstombs(char*, wchar_t*, int)
elle signifie wide chars to multibyte chars.
et wcslen(wchar_t*) renvoie un int et signifie wide chars length.
 
Voilaà si qq'un sait pourquoi ca merde. Merci.


Message édité par Toby14 le 01-08-2005 à 12:06:15
Reply

Marsh Posté le 01-08-2005 à 12:04:51   

Reply

Marsh Posté le 01-08-2005 à 23:01:42    

Personne ne sait?
Esce que ca viendrait pas du fait que je converti d'un const vers du pas const?

Reply

Marsh Posté le 04-08-2005 à 09:01:40    

Depuis quand on utilise malloc en C++? Je l'utilise dans l'exemple pour que tu puisses l'utiliser
 
char* Menu :: wchar_t_to_char(const wchar_t* wc)
{
  if(wc!=NULL)
  {
    int i;
    char* lwc = malloc(wcslen(wc) + 1); // +1 pour le zéro
    while(*wc) *lwc++ = (char)*wc++;
    return lwc;
  }
  return "error"; // le 0 terminal est implicite....
}
 
C'est quand même bizarre d'allouer dans une fonction sans libérer dans celle-ci. T'aurais pas des petites fuites dans ton prog?

Reply

Marsh Posté le 04-08-2005 à 13:58:18    

Utilise des wstring/string.

Code :
  1. #include <iostream>
  2. #include <string>
  3. std::string to_string( const std::wstring & wstr )
  4. {
  5.     char * buffer = 0;
  6.     try
  7.     {
  8.         size_t buffer_size = wstr.size() + 1;
  9.         buffer = new char[ buffer_size ];
  10.         size_t nb = std::wcstombs( buffer, wstr.c_str(), buffer_size );
  11.         std::string result;
  12.         if ( nb == static_cast<size_t>( -1 ) )
  13.         {
  14.             result = "error";
  15.         }
  16.         else
  17.         {
  18.             result = buffer;
  19.         }
  20.         delete [] buffer;
  21.         return result;
  22.     }
  23.     catch ( ... )
  24.     {
  25.         delete [] buffer;
  26.         throw;
  27.     }
  28. }
  29. int main()
  30. {
  31.     std::cout << to_string( L"/WaterWorld" ) << '\n';
  32. }



---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-08-2005 à 17:43:24    

Merci bien à vous deux.  
C'est vrai que pour l'allocation malloc il doit y avoir une petite fuite mais celle-ci est minime car appelé très peu souvent, mais ce n'est pas une raison je suis d'accord. Je vais voir ça.
Les wstring j'avais essayé mais j'avais une erreur qui m'a gonflé. J'incluais string et le compilo ne disais rien mais impossible après d'utiliser std::string et les wcout alors j'ai essayé autrement.

Reply

Marsh Posté le 27-08-2005 à 08:14:13    

tu peux aussi utiliser la fonction MFC WideCharToMultiByte et sous ATL la macro W2T


---------------
1000 tofs d'A380 : --> http://www.flickr.com/photos/tags/A380/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed