2011-04-09 5 views
0

J'ai besoin de générer une chaîne UTF8 pour passer à une bibliothèque tierce et j'ai du mal à trouver la bonne gymnastique ... Aussi, pour ne rien arranger, je suis coincé avec C++ Builder 6 et tous les Par exemple, j'ai trouvé des exemples d'utilisation de std :: string pour lesquels CBuilder6 n'a aucun support. Je voudrais accomplir cela sans utiliser STL quoi que ce soit.Conversion UTF8

Voici mon code jusqu'ici que je ne peux pas sembler faire le travail.

wchar_t *SS1; 
char *SS2; 

    SS1 = L"select * from mnemonics;"; 

    int strsize = WideCharToMultiByte(CP_UTF8, 0, SS1, wcslen(SS1), NULL, 0, NULL, NULL); 

    SS2 = new char[strsize+1]; 

    WideCharToMultiByte(CP_UTF8, 0, SS1, wcslen(SS1), SS2, strsize, NULL, NULL); 

La bibliothèque de la troisième partie s'établit lorsque je la passe en tant que paramètre SS2. Évidemment, je suis sur une plateforme Windows utilisant WideCharToMultiByte de Microsoft mais finalement je ne voudrais pas avoir besoin de cet appel de fonction car ce code doit aussi être compilé sur une plateforme embarquée aussi bien sous Linux mais je franchirai ce pont quand j'y arriverai .

Pour l'instant, j'ai juste besoin de pouvoir convertir un wchar_t ou un char en une chaîne encodée en UTF8 de préférence sans utiliser de STL. Je n'aurai pas de STL sur la plate-forme intégrée.

Merci!

Répondre

2

Quelque chose comme ça:

extern void someFunctionThatAcceptsUTF8(const char* utf8); 

const char* ss1 = "string in system default multibyte encoding"; 

someFunctionThatAcceptsUTF8(w2u(a2w(ss1))); // that conversion you need: 
               // a2w: "ansi" -> widechar string 
               // w2u: widechar string -> utf8 string. 

Vous avez juste besoin de saisir et inclure ce fichier: http://code.google.com/p/tiscript/source/browse/trunk/sdk/include/aux-cvt.h

Il devrait fonctionner sur Builder très bien.

+0

EXACTEMENT ce que je cherchais. Bien que pour CBuilder6 j'ai dû ajouter quelques #defines pour le faire fonctionner. CBuilder6 ne connaissait pas _stricmp (le connaissait comme strictmp) et il ne connaissait pas _itoa que j'ai corrigé avec un sprintf ... Nice! Je vous remercie! – Eric

0

Si vous êtes toujours à la recherche d'une réponse, voici une implémentation simple d'un convertisseur de UTF8 en langage C:

/* 
** Transforms a wchar to utf-8, returning a string of converted bytes 
*/ 

void   ft_to_utf8(wchar_t c, unsigned char *buffer) 
{ 
    if (c < (1 << 7)) 
     *buffer++ = (unsigned char)(c); 
    else if (c < (1 << 11)) 
    { 
     *buffer++ = (unsigned char)((c >> 6) | 0xC0); 
     *buffer++ = (unsigned char)((c & 0x3F) | 0x80); 
    } 
    else if (c < (1 << 16)) 
    { 
     *buffer++ = (unsigned char)((c >> 12) | 0xE0); 
     *buffer++ = (unsigned char)(((c >> 6) & 0x3F) | 0x80); 
     *buffer++ = (unsigned char)((c & 0x3F) | 0x80); 
    } 
    else if (c < (1 << 21)) 
    { 
     *buffer++ = (unsigned char)((c >> 18) | 0xF0); 
     *buffer++ = (unsigned char)(((c >> 12) & 0x3F) | 0x80); 
     *buffer++ = (unsigned char)(((c >> 6) & 0x3F) | 0x80); 
     *buffer++ = (unsigned char)((c & 0x3F) | 0x80); 
    } 
    *buffer = '\0'; 
}