【发布时间】:2011-08-06 02:28:17
【问题描述】:
如何将 UTF-8 char* 中的字符串转换为 CString?
【问题讨论】:
标签: c++ utf-8 char cstring unicode-string
如何将 UTF-8 char* 中的字符串转换为 CString?
【问题讨论】:
标签: c++ utf-8 char cstring unicode-string
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”类型的功能,所以我认为你必须往返它——用你想要的任何代码页调用MultiByteToWideChar 和CP_UTF8 然后WideCharToMultiByte结果char* in.
如果您的字符串仅包含代码为 0 到 127 的 ASCII 字符,您可能会将 UTF-8 字符串威胁为 ASCII 字符串并用它初始化 CString:
CString my_cstr((char*)my_string);
否则(如果您的 UTF-8 字符串包含一些其他字符)您将无法轻松地从中获取 char* 字符串。
【讨论】: