CString與UTF8互轉代碼


這個代碼網上很多,留在這里做個備份。

static 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, wbuffer.data(), wbuffer.size(), NULL, 0, NULL, NULL );
	/* 獲取轉換后內容 */
	std::string buffer;
	buffer.resize( length );

	WideCharToMultiByte( CP_UTF8, 0, strValue, -1, (LPSTR) (buffer.data() ), length, NULL, NULL );
	return(buffer);
}


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM