How do I convert a string in UTF-8 char* to 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;
}
Though this function is valid for both UNICODE and non-UNICODE configurations IMHO using UNICODE configuration in Win32 programs is much more productive (in general and in this function).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With