4

UTF-8 char *の文字列をCStringに変換するにはどうすればよいですか?

4

3 に答える 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 に答える