MFC字符Unicode轉UTF-8 續篇

當初寫的第一篇關於亂碼問題的兩個函數,其實還是有問題的,如果兩個Windows系統的默認編碼不一樣,那麼就會發生問題了,我也是今天才遇到的,所以就一併寫出來。給以後的人提醒。  MultiByteToWideChar WideCharToMultiByte第一個參數CP_AP在上篇解決亂碼中就是用的這個參數,但是這個參數有缺陷,在MSDN中提到The current system Windows ANSI code page. This value can be different on different computers, even on the same network.  意思大概是該值是當前系統的windowsANSI編碼,在不同的計算機上可能是不同的,即使在同樣的網絡。  所以有可能系統不一樣,或者被改掉之後改值就會發生變化,所以上篇文章中的函數在解決亂碼時在可能會發生問題的。 改掉也很簡單就是將CP_AP 改成gb2312或者直接936 ,這樣就是強制性的gbk 跟utf-8之間轉換。就通用了。

 char* EncodeToUTF8(const char* mbcsStr)
{
 wchar_t*  wideStr;
 char*   utf8Str;
 int   charLen;

 charLen = MultiByteToWideChar(936, 0, mbcsStr, -1, NULL, 0);    ////////936 ----- gb2312
 wideStr = (wchar_t*) malloc(sizeof(wchar_t)*charLen);
 MultiByteToWideChar(936, 0, mbcsStr, -1, wideStr, charLen);

 charLen = WideCharToMultiByte(CP_UTF8, 0, wideStr, -1, NULL, 0, NULL, NULL);

 utf8Str = (char*) malloc(charLen);

 WideCharToMultiByte(CP_UTF8, 0, wideStr, -1, utf8Str, charLen, NULL, NULL);

 free(wideStr);
 return utf8Str;

}
char* UTF8ToEncode(const char* mbcsStr)
{
 wchar_t*  wideStr;
 char*   unicodeStr;
 int   charLen;

 charLen = MultiByteToWideChar(CP_UTF8, 0, mbcsStr, -1, NULL, 0);  
 wideStr = (wchar_t*) malloc(sizeof(wchar_t)*charLen);
 MultiByteToWideChar(CP_UTF8, 0, mbcsStr, -1, wideStr, charLen); 

 charLen =WideCharToMultiByte(936, 0, wideStr, -1, NULL, 0, NULL, NULL); 
 unicodeStr = (char*)malloc(charLen);
    WideCharToMultiByte(936, 0, wideStr, -1, unicodeStr, charLen, NULL, NULL); 

 free(wideStr);
 return unicodeStr;
}

好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章