在Windows環境下使用VC++
並沒有像QT一樣直接有QStrring可以直接對字串內容進行編碼轉換
所以我們必須對字元陣列作處理
使用MultiByteToWideChar和WideCharToMultiByte可以達成字元編碼的轉換
第一個參數所傳入的CodePage可以轉換成不同的編碼
因為我自己要使用是為了傳入TinyXml儲存資訊用
所以轉成Unicode之後還要再轉成utf-8
轉換後的字元陣列存入xml才不會是亂碼
先將ANSI轉為Unicode
//求size
int size = MultiByteToWideChar(CP_ACP, 0, pStr, -1, NULL, 0);
//使用剛剛求出的size建立寬字元字串
wchar_t *pWStr = new wchar_t[size+1];
//將字串寫入寬字元字串
MultiByteToWideChar(CP_ACP, 0, pStr, -1, pWStr, size);
執行之後 pWStr便會得到Unicode字串
然後再將Unicode轉為utf-8
//一樣求size
int utf8Size = WideCharToMultiByte(CP_UTF8, 0, pWStr, -1, NULL, 0, NULL, false);
//使用剛剛求出的size建立字串
char* utf8Str = new char[utf8Size+1];
//將寬字元字串寫入字串
WideCharToMultiByte(CP_UTF8, 0, pWStr, -1, utf8Str, utf8Size, NULL, false);
所以最後得到的utf8Str 便是我們要的utf-8字串
轉回來也是一樣
char* pStr = "中文測試";
int size = MultiByteToWideChar(CP_UTF8, 0, pStr, -1, NULL, 0);
//使用剛剛求出的size建立寬字元字串
wchar_t *pWStr = new wchar_t[size+1];
//將字串寫入寬字元字串
MultiByteToWideChar(CP_UTF8, 0, pStr, -1, pWStr, size);
//再從Unicode轉為utf8
//一樣求size
int ansiSize = WideCharToMultiByte(CP_ACP, 0, pWStr, -1, NULL, 0, NULL, false);
//使用剛剛求出的size建立字串
char* ansiStr = new char[ansiSize+1];
//將寬字元字串寫入字串
WideCharToMultiByte(CP_ACP, 0, pWStr, -1, ansiStr, ansiSize, NULL, false);
差別只是在於
utf-8和Unicode互相轉換時要傳入CP_UTF8作為CodePage的參數
ANSI和Unicode互相轉換時則是要傳入CP_ACP
經過轉碼之後TinyXml儲存的utf-8編碼XML就不再會是亂碼了
有更好的做法還請大大們告知 謝謝
感謝您的無私分享~~~
回覆刪除//求size
int size = MultiByteToWideChar(CP_ACP, 0, pStr, -1, NULL, 0);
//使用剛剛求出的size建立寬字元字串
wchar_t *pWStr = new wchar_t[size+1];
//將字串寫入寬字元字串
MultiByteToWideChar(CP_ACP, 0, pStr, -1, pWStr, size);
===============
上面的size部分有可能會少給,建議得在多處理size = size*sizeof(wchar_t)