【问题标题】:Conversion of UTF-8 char * to CStringUTF-8 char * 到 CString 的转换
【发布时间】:2011-08-06 02:28:17
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:
    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 字符串转换为该 CP 的单字节字符串。
    • @Jurlie:阅读 memcpy 之前的评论。虽然可能我现在会发布实现。
    • 编辑帖子以包含 UTF8 到当前 8 位代码页的转换。
    【解决方案2】:

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

    【讨论】:

    • 我想把它转换成char*而不是wchar_t *..有什么方法吗?
    • @Athreya:你到底为什么想要那个?这种转换必然是有损的——如果字符串以 Unicode 开头,是什么让你认为它只包含 ANSI 字符?
    • 我需要使用仅接受 char* 作为输入的 OCI 库来解析和执行语句
    • @Athreya:char* 不是你已经拥有的吗?无论如何,我不知道有任何“MultiByteToMultiByte”类型的功能,所以我认为你必须往返它——用你想要的任何代码页调用MultiByteToWideCharCP_UTF8 然后WideCharToMultiByte结果char* in.
    【解决方案3】:

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

    CString my_cstr((char*)my_string);
    

    否则(如果您的 UTF-8 字符串包含一些其他字符)您将无法轻松地从中获取 char* 字符串。

    【讨论】:

    • 我在 UTF-8 字符串中有其他字符
    • @Athreya 您要将字符串转换为什么代码页?或者至少是什么语言?您确定您的 UTF-8 字符串完全可以表示为单字节字符串吗?
    • @Athreya : Jurlie 的意思是 无损 表示为单字节字符串。您对这个答案的第一条评论表明情况并非如此。
    • 我的意思是要转换的字符串语言,而不是编程语言:-D
    • @Julie 字符串是日语
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2015-08-07
    • 2011-11-02
    • 2020-06-12
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多