Cocos2d-x项目移植到WP8系列之七:中文显示乱码
原文链接:http://www.cnblogs.com/zouzf/p/3984628.html
C++和C#互调时经常会带一些参数过去例如最常见的字符串,如果字符串里有中文的话,会发现传递过去后变成了乱码,这是因为两边的编码方式不一样,C#默认使用UnicodeEncoding(中文环境下是GBK?)编码,C++(Lua和cocos2d-x引擎默认编码为UTF-8)里用的是utf8编码。大概流程就是 C++的里的std::string字符串转成 C++/CX 里的 Platform::string,再传到C#里System.String ,从C#到C++的话就是反过来。
Cocos其实已经自带了相关代码,就在:CCWinRTUtils.h 和CCWinRTUtils.cpp里
std::string 转 platform^ string
1 std::wstring CCUtf8ToUnicode(const char * pszUtf8Str, unsigned len/* = -1*/) 2 { 3 std::wstring ret; 4 do 5 { 6 if (! pszUtf8Str) break; 7 // get UTF8 string length 8 if (-1 == len) 9 { 10 len = strlen(pszUtf8Str); 11 } 12 if (len <= 0) break; 13 14 // get UTF16 string length 15 int wLen = MultiByteToWideChar(CP_UTF8, 0, pszUtf8Str, len, 0, 0); 16 if (0 == wLen || 0xFFFD == wLen) break; 17 18 // convert string 19 wchar_t * pwszStr = new wchar_t[wLen + 1]; 20 if (! pwszStr) break; 21 pwszStr[wLen] = 0; 22 MultiByteToWideChar(CP_UTF8, 0, pszUtf8Str, len, pwszStr, wLen + 1); 23 ret = pwszStr; 24 CC_SAFE_DELETE_ARRAY(pwszStr); 25 } while (0); 26 return ret; 27 }
1 std::string str = "测试"; 2 Platform::String ^pStr_str = ref new Platform::String(CCUtf8ToUnicode(str.c_str()).c_str());
platform^ string 转 std::string
1 std::string CCUnicodeToUtf8(const wchar_t* pwszStr) 2 { 3 std::string ret; 4 do 5 { 6 if(! pwszStr) break; 7 size_t len = wcslen(pwszStr); 8 if (len <= 0) break; 9 10 size_t convertedChars = 0; 11 char * pszUtf8Str = new char[len*3 + 1]; 12 WideCharToMultiByte(CP_UTF8, 0, pwszStr, len+1, pszUtf8Str, len*3 + 1, 0, 0); 13 ret = pszUtf8Str; 14 CC_SAFE_DELETE_ARRAY(pszUtf8Str); 15 }while(0); 16 17 return ret; 18 }
1 Platform::String^ str = "测试"; 2 string str1 = CCUnicodeToUtf8(str);
原文链接:http://www.cnblogs.com/zouzf/p/3984628.html