如何将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配置更加高效(一般情况下和在这个函数中)。
使用代码页为CP_UTF8
的MultiByteToWideChar
函数进行调用,然后像往常一样使用CString。
char*
不就是你已经有的吗?无论如何,我不知道任何“MultiByteToMultiByte”类型的函数,所以我认为你需要来回转换它——用 CP_UTF8
调用 MultiByteToWideChar
然后再用你想要的任何代码页调用 WideCharToMultiByte
获取结果的 char*
。 - ildjarn如果您的字符串仅包含ASCII字符,其代码为0到127,则可以将UTF-8字符串视为ASCII字符串并使用它初始化CString:
CString my_cstr((char*)my_string);