當初寫的第一篇關於亂碼問題的兩個函數,其實還是有問題的,如果兩個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;
}
好了。