当初写的第一篇关于乱码问题的两个函数,其实还是有问题的,如果两个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;
}
好了。