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;
}

好了。

你可能感兴趣的:(Windows/VC/MFC)