c++ - UTF-8 char * 到 CString 的转换

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

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

最佳答案

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 配置效率更高(通常和在这个函数中)。

关于c++ - UTF-8 char * 到 CString 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5673194/

相关文章:

c++ - 沿类层次结构的函数指针强制

c++ - GpuMat - 访问自定义内核中的 2 channel float 据

java - 在数组中查找 Char,如果不存在则添加到新的 String 数组中

SPARQL 中的 UTF-8 格式

Ruby 将 CSV 文件读取为 UTF-8 和/或将 ASCII-8Bit 编码转换为 UTF-8

计算二维字符数组中单词的出现次数

c - 如何从 IplImage* 中取出 JPEG 并且不将其保存到硬盘并将保存的数据放入 char* 中?

c++ - 将模板实例导出为 C 函数

c++ - 密码无效

c++ - 如何转换 UTF-8 <-> UTF16 便携