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;
}