将UTF-8 char *转换为CString

时间:2011-04-15 06:37:49

标签: c++ utf-8 char cstring unicode-string

如何将UTF-8 char *中的字符串转换为CString?

3 个答案:

答案 0 :(得分:4)

使用CP_UTF8的代码页调用MultiByteToWideChar,然后正常使用CString。

答案 1 :(得分:4)

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配置都有效,但在Win32程序中使用UNICODE配置的IMHO效率更高(通常和此功能)。

答案 2 :(得分:0)

如果您的字符串仅包含代码为0到127的ASCII字符,您可能会将您的UTF-8字符串威胁为ASCII字符串并用它初始化CString:

CString my_cstr((char*)my_string);

否则(如果您的UTF-8字符串包含其他一些字符),您就没有简单的方法从中获取char *字符串。