首页 > 代码库 > Cocos2d-x项目移植到WP8系列之七:中文显示乱码
Cocos2d-x项目移植到WP8系列之七:中文显示乱码
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 length15 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
Cocos2d-x项目移植到WP8系列之七:中文显示乱码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。