1. 程式人生 > >寬字元UTF-8轉窄字元ANSI(使用tinyxml2亂碼問題)

寬字元UTF-8轉窄字元ANSI(使用tinyxml2亂碼問題)

使用tinyxml2讀取UTF-8編碼的XML時,中文亂碼,tiny沒有類似於QString::tostdwstring的方法,需要幾己轉換一下。

對網上搜索的結果不甚滿意,自己重寫了一個方法。

std::string UTF8ToGBK( const char *iUTF8 )
{
	//寬字元長度
	int wclen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)iUTF8, -1, NULL, 0);
	wchar_t *wszGBK = new wchar_t[wclen+1];
	memset(wszGBK, 0, wclen+1);
	MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)iUTF8, -1, (LPWSTR)wszGBK, wclen);

	//窄字元長度
	int clen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
	char *szGBK = new char[clen+1];
	memset(szGBK, 0, clen + 1);
	WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, clen, NULL, NULL);

	std::string strTransf=szGBK;
	delete []szGBK;
	delete []wszGBK;

	return strTransf;
}

用到了memset(buffer, 0, sizeof(buffer)),它用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為0。例:char a[100];memset(a, 0, sizeof(a));

 

另外,對於const char*與char*之間的轉換,

1.const char*不能直接賦值到char*,理由:假如可以的話,那麼通過char*就可以修改const char*指向的內容,這是不允許的。所以char*要另外開闢新的空間。

 const char* cpc="abc";
 char* pc=new char[100];
 strcpy(pc,cpc);


2.char*到 const char*直接賦值即可

char* pc="abcde";const char* cp=pcc;