Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ UTF-8字符*到CString的转换_C++_Utf 8_Char_Cstring_Unicode String - Fatal编程技术网

C++ UTF-8字符*到CString的转换

C++ UTF-8字符*到CString的转换,c++,utf-8,char,cstring,unicode-string,C++,Utf 8,Char,Cstring,Unicode String,如何将UTF-8字符*中的字符串转换为CString?使用CP\u UTF8的代码页调用,然后正常使用CString。如果字符串仅包含代码为0到127的ASCII字符,则可能会威胁将UTF-8字符串作为ASCII字符串,并使用它初始化CString: CString my_cstr((char*)my_string); 否则(如果您的UTF-8字符串包含一些其他字符),则无法从中轻松获取char*string。bool Utf8ToCString(CString&cstr,const char

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

使用
CP\u UTF8
的代码页调用,然后正常使用CString。

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

CString my_cstr((char*)my_string);
否则(如果您的UTF-8字符串包含一些其他字符),则无法从中轻松获取char*string。

bool Utf8ToCString(CString&cstr,const char*utf8Str)
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;
}
{ 大小\u t utf8StrLen=strlen(utf8Str); 如果(utf8StrLen==0) { cstr.Empty(); 返回true; } LPTSTR*ptr=cstr.GetBuffer(utf8StrLen+1); #ifdef UNICODE //CString是UNICODE字符串,所以我们进行解码 int newLen=MultiByteToWideChar( CP_UTF8,0, utf8Str、utf8StrLen、ptr、utf8StrLen+1 ); 如果(!newLen) { cstr.释放缓冲区(0); 返回false; } #否则 WCHAR*buf=(WCHAR*)malloc(utf8StrLen); 如果(buf==NULL) { cstr.释放缓冲区(0); 返回false; } int newLen=MultiByteToWideChar( CP_UTF8,0, utf8Str,utf8StrLen,buf,utf8StrLen ); 如果(!newLen) { 免费(buf); cstr.释放缓冲区(0); 返回false; } 断言(newLen

尽管此函数对UNICODE和非UNICODE配置都有效,但在Win32程序中使用UNICODE配置的IMHO效率更高(一般来说,在该函数中也是如此)。

我希望将其转换为char*而不是wchar\u t*。。有什么办法吗?@Athreya:你到底为什么要这样?这种转换必然是有损的——如果字符串一开始是Unicode,那么您怎么会认为它只包含ANSI字符呢?我需要使用OCI库解析并执行该语句,该库只接受char*作为input@Athreya:你不是已经拥有了什么吗?在任何情况下,我都不知道任何“MultiByteToMultiByte”类型的函数,因此,我认为您必须对其进行往返调用--使用
CP\u UTF8
调用
MultiByteToWideChar
,然后使用您希望得到的
char*
中的任何代码页调用
MultiByteToWideChar
。我在UTF-8中还有其他字符string@Athreya要将字符串转换为什么代码页?或者至少是什么语言?你确定你的UTF-8字符串可以表示为单字节字符串吗?@Athreya:Jurlie的意思是无损地表示为单字节字符串。您对这个答案的第一个评论表明情况并非如此。我指的是要转换的字符串语言,而不是编程语言:-D@Julie字符串是japanesethat,这不是解决方案。解决方案是找出目标单字节代码页,并将UTF-8字符串转换为该CP的单字节字符串。@Jurlie:在memcpy之前阅读注释。尽管可能是,我现在将发布实现。编辑此帖子以包含UTF8到当前8位代码页的转换。