UTF-8 char *の文字列をCStringに変換するにはどうすればよいですか?
13929 次
3 に答える
5
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構成を使用するIMHOの方がはるかに生産的です(一般に、この関数で)。
于 2011-04-15T07:04:19.850 に答える
4
MultiByteToWideChar
のコードページで呼び出してからCP_UTF8
、通常どおりCStringを使用します。
于 2011-04-15T06:45:09.440 に答える
0
文字列にコード0〜127のASCII文字のみが含まれている場合は、UTF-8文字列をASCII文字列として脅し、CStringを初期化することができます。
CString my_cstr((char*)my_string);
それ以外の場合(UTF-8文字列に他の文字が含まれている場合)、そこからchar*文字列を取得する簡単な方法はありません。
于 2011-04-15T07:03:41.277 に答える