UTF-8字符*转换为CString

4
如何将UTF-8 char*字符串转换为CString?
3个回答

5
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配置更加高效(一般情况下和在这个函数中)。


解决方案是找出目标单字节代码页,并将UTF-8字符串转换为该代码页的单字节字符串。 - Jurlie
@Jurlie:在执行memcpy之前请先阅读注释。虽然我现在可能会发布实现。 - Serge Dundich
编辑了帖子,将UTF8转换为当前的8位代码页。 - Serge Dundich

4

使用代码页为CP_UTF8MultiByteToWideChar函数进行调用,然后像往常一样使用CString。


我希望它被转换为char而不是wchar_t。有什么方法吗? - Greenhorn
1
@Athreya:你到底为什么想要那个?这种转换肯定会有损失,如果字符串一开始就是Unicode的话,你怎么能确定它只包含ANSI字符呢? - ildjarn
我需要使用OCI库解析和执行语句,该库只接受char*作为输入。 - Greenhorn
3
@Athreya :char* 不就是你已经有的吗?无论如何,我不知道任何“MultiByteToMultiByte”类型的函数,所以我认为你需要来回转换它——用 CP_UTF8 调用 MultiByteToWideChar 然后再用你想要的任何代码页调用 WideCharToMultiByte 获取结果的 char* - ildjarn

0

如果您的字符串仅包含ASCII字符,其代码为0到127,则可以将UTF-8字符串视为ASCII字符串并使用它初始化CString:

CString my_cstr((char*)my_string);

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

我在 UTF-8 字符串中还有其他字符。 - Greenhorn
@Athreya,您想将字符串转换为哪种代码页?或者至少是什么语言?您确定您的UTF-8字符串是否可以表示为单字节字符串吗? - Jurlie
@Athreya:Jurlie 意味着以单字节字符串的形式进行无损表示。而你对这个答案的第一个评论表明这不是这种情况。 - ildjarn
我指的是要转换的字符串语言,而不是编程语言 :-D - Jurlie
@朱莉,这个字符串是日语。 - Greenhorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接