2011-04-15 97 views

回答

3

撥打電話MultiByteToWideChar,其代碼頁爲CP_UTF8,然後正常使用CString。

+0

我希望它被轉換爲char *不是wchar_t * ..是否有任何方法? – Greenhorn 2011-04-15 06:49:27

+1

@Athreya:你爲什麼要這樣做?這種轉換必然是有損的 - 如果字符串是以Unicode開頭的,是什麼讓你認爲它只包含ANSI字符? – ildjarn 2011-04-15 06:53:06

+0

我需要使用OCI庫解析和執行語句,它只接受char *作爲輸入 – Greenhorn 2011-04-15 06:54:39

0

如果字符串只包含ASCII字符與代碼0到127你可能威脅您的UTF-8字符串作爲ASCII字符串,並將其初始化CString的:

CString my_cstr((char*)my_string); 

否則(如果您的UTF-8字符串包含一些其他字符),你沒有簡單的方法從它獲得char *字符串。

+0

我在UTF-8字符串中有其他字符。 – Greenhorn 2011-04-15 07:04:58

+0

@Athreya什麼是您想要將字符串轉換爲字符串的代碼頁?或者至少是什麼語言?你確定你的UTF-8字符串可以表示爲單字節字符串嗎? – Jurlie 2011-04-15 07:15:08

+0

@Athreya:Jurlie表示*無損*表示爲單字節字符串。你對這個答案的第一個評論表明情況並非如此。 – ildjarn 2011-04-15 07:23:33

3
bool Utf8ToCString(CString& cstr, const char* utf8Str) 
{ 
    size_t utf8StrLen = strlen(utf8Str); 

    if(utf8StrLen == 0) 
    { 
     cstr.Empty(); 
     return true; 
    } 

    LPTSTR* ptr = cstr.GetBuffer(utf8StrLen+1); 

#ifdef UNICODE 
    // CString is UNICODE string so we decode 
    int newLen = MultiByteToWideChar(
        CP_UTF8, 0, 
        utf8Str, utf8StrLen, ptr, utf8StrLen+1 
        ); 
    if(!newLen) 
    { 
     cstr.ReleaseBuffer(0); 
     return false; 
    } 
#else 
    WCHAR* buf = (WCHAR*)malloc(utf8StrLen); 

    if(buf == NULL) 
    { 
     cstr.ReleaseBuffer(0); 
     return false; 
    } 

    int newLen = MultiByteToWideChar(
        CP_UTF8, 0, 
        utf8Str, utf8StrLen, buf, utf8StrLen 
        ); 
    if(!newLen) 
    { 
     free(buf); 
     cstr.ReleaseBuffer(0); 
     return false; 
    } 

    assert(newLen < utf8StrLen); 
    newLen = WideCharToMultiByte(
        CP_ACP, 0, 
        buf, newLen, ptr, utf8StrLen 
        ); 
    if(!newLen) 
    { 
     free(buf); 
     cstr.ReleaseBuffer(0); 
     return false; 
    } 

    free(buf); 
#endif 

    cstr.ReleaseBuffer(newLen); 
    return true; 
} 

雖然此函數是有效的既UNICODE和非UNICODE配置IMHO在Win32程序使用UNICODE配置更加多產(一般而言,在這種功能)。

+0

這不是一個解決方案。解決方案是找出目標單字節代碼頁並將UTF-8字符串轉換爲該CP的單字節字符串。 – Jurlie 2011-04-15 07:13:07

+0

@Jurlie:閱讀memcpy之前的評論。雖然可能我現在會發布實施。 – 2011-04-15 07:16:28

+0

編輯帖子以包含UTF8到當前的8位代碼頁轉換。 – 2011-04-15 07:28:38