CString與utf-8互轉

std::string ConvertCStringToUTF8( CString strValue )
{
    std::wstring wbuffer;
#ifdef _UNICODE
    wbuffer.assign( strValue.GetString(), strValue.GetLength() );
#else
    /*
     * 轉換ANSI到UNICODE
     * 獲取轉換後長度
     */
    int length = ::MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, (LPCTSTR) strValue, -1, NULL, 0 );
    wbuffer.resize( length );
    /* 轉換 */
    MultiByteToWideChar( CP_ACP, 0, (LPCTSTR) strValue, -1, (LPWSTR) (wbuffer.data() ), wbuffer.length() );
#endif

    /* 獲取轉換後長度 */
    int length = WideCharToMultiByte( CP_UTF8, 0, strValue, -1, NULL, 0, NULL, NULL );
    /* 獲取轉換後內容 */
    std::string buffer;
    buffer.resize( length );

    WideCharToMultiByte( CP_UTF8, 0, strValue, -1,
                 (LPSTR) (buffer.data() ), length, NULL, NULL );
    return(buffer);
}
CString ConvertUTF8ToCString( std::string utf8str )
{
    /* 預轉換,得到所需空間的大小 */
    int nLen = ::MultiByteToWideChar( CP_UTF8, NULL,
                      utf8str.data(), utf8str.size(), NULL, 0 );
    /* 轉換爲Unicode */
    std::wstring wbuffer;
    wbuffer.resize( nLen );
    ::MultiByteToWideChar( CP_UTF8, NULL, utf8str.data(), utf8str.size(),
                   (LPWSTR) (wbuffer.data() ), wbuffer.length() );

#ifdef UNICODE
    return(CString( wbuffer.data(), wbuffer.length() ) );
#else
    /*
     * 轉換爲ANSI
     * 得到轉換後長度
     */
    nLen = WideCharToMultiByte( CP_ACP, 0,
                    wbuffer.data(), wbuffer.length(), NULL, 0, NULL, NULL );

    std::string ansistr;
    ansistr.resize( nLen );

    /* 把unicode轉成ansi */
    WideCharToMultiByte( CP_ACP, 0, (LPWSTR) (wbuffer.data() ), wbuffer.length(),
                 (LPSTR) (ansistr.data() ), ansistr.size(), NULL, NULL );
    return(CString( ansistr.data(), ansistr.length() ) );
#endif
}
char* UnicodeToUtf8(CString str)
{
	wchar_t* unicode= str.AllocSysString();
	int len;
	len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
	char *szUtf8 = (char*)malloc(len + 1);
	memset(szUtf8, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
	return szUtf8;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章