2013年7月19日 星期五

使用MultiByteToWideChar和WideCharToMultiByte進行ANSI與UTF8編碼轉換

在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就不再會是亂碼了

有更好的做法還請大大們告知 謝謝

1 則留言:

  1. 感謝您的無私分享~~~

    //求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)

    回覆刪除