寬字元UTF-8轉窄字元ANSI(使用tinyxml2亂碼問題)
阿新 • • 發佈:2018-11-28
使用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;