2011-04-09 123 views
0

我需要生成一個UTF8字符串傳遞給第三方庫,我很難搞清楚正確的體操...另外,爲了讓事情變得更糟,我被卡在C++ Builder 6中例如我發現使用std :: string的CBuilder6顯然不支持。我想在不使用STL的情況下實現這一點。UTF8轉換

這是我的代碼到目前爲止,我似乎無法工作。

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); 

第三方庫扼流器,當我通過它SS2作爲參數。很顯然,我在使用微軟的WideCharToMultiByte的Windows平臺上,但最終我不想要這個函數調用,因爲這個代碼也必須在嵌入式平臺上編譯,也可以在Linux下編譯,但是當我到達它時我會跨過那個橋樑。

現在,我只需要能夠將wchar_t或char轉換爲UTF8編碼的字符串,而不使用任何STL。我不會在嵌入式平臺上使用STL。

謝謝!

回答

2

類似的東西:

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. 

你只需要抓住幷包含這個文件: http://code.google.com/p/tiscript/source/browse/trunk/sdk/include/aux-cvt.h

應該在構建器就好了工作。

+0

正是我一直在尋找。雖然對於CBuilder6,我不得不添加一些#defines來使其工作。 CBuilder6不知道_stricmp(知道它是stricmp),它不知道我用sprintf修復的_itoa ...很好!謝謝! – Eric 2011-04-10 09:48:58

0

如果你還在尋找一個答案,這裏是C語言的簡單實現一個UTF8轉換的:

/* 
** 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'; 
}