cocos2dx 3.0 windows平台 中文乱码解决(原创)
因为linux下cocostudio wine安装不上 而且又要开发windows程序 果断舍弃了ubuntu而实用vs2013 去玩cocos2dx3.0
花了一天的时间才解决中文乱码 泪奔ing 分享记录下 下面是我尝试的的过程:
1相关设置
右键项目属性——》配置属性---》常规---选择Unicode编码
发现仍然是乱码
2 更换字体无效(我最开始一直以为这个问题 各种纠结)
3使用Userdefault存数据在取出
xml文件是utf8的 但是取出还是无效
4.严重怀疑编译器虽然调整为Unicode 但是缺要转为ansi编译 而编译过程中某些字符串可能不转编码导致乱码。。。(对于vs不太了解)
疯狂查看源码和各种资料 发现 项目名称/cocos2d/extensions/proj.win32
里面有个win32inputbox的类(h和cpp)查看里面有转码方法(网上2.x给的资料是有个third_party里面有转码 但是没找到)
在源码中引入头文件无效(原因是虽然文件存在 但是编译器没有把他识别为源码)需要在解决工具面板 右键添加现有项 添加头文件和cpp文件沮洳工程即可
Win32InputBox.h Win32InputBox.cpp 两个文件 要把 他们通过添加现有项的方式添加进来 然后看h的源码 里面有静态转码函数
然后使用
std::string CWin32InputBox::AnsiToUtf8(std::string strAnsi) 转换一下即可(其实为什么要转成utf8 我也不懂 我试着反着转换发现不行)
有源码就是好 找不到的东西最后到源码包里面去翻 可以深入理解每一个细节。。。。
ps:我觉得那两个静态转换的函数挺实用的 果断记录下来 以后在遇到编码问题的时候备用
#include <windows.h> #include <tchar.h>
std::string AnsiToUtf8(std::string strAnsi) { std::string ret; if (strAnsi.length() > 0) { int nWideStrLength = MultiByteToWideChar(CP_ACP, 0, strAnsi.c_str(), -1, NULL, 0); WCHAR* pwszBuf = (WCHAR*)malloc((nWideStrLength+1)*sizeof(WCHAR)); memset(pwszBuf, 0, (nWideStrLength+1)*sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, strAnsi.c_str(), -1, pwszBuf, (nWideStrLength+1)*sizeof(WCHAR)); int nUtf8Length = WideCharToMultiByte( CP_UTF8,0,pwszBuf,-1,NULL,0,NULL,FALSE ); char* pszUtf8Buf = (char*)malloc((nUtf8Length+1)*sizeof(char)); memset(pszUtf8Buf, 0, (nUtf8Length+1)*sizeof(char)); WideCharToMultiByte(CP_UTF8, 0, pwszBuf, -1, pszUtf8Buf, (nUtf8Length+1)*sizeof(char), NULL, FALSE); ret = pszUtf8Buf; free(pszUtf8Buf); free(pwszBuf); } return ret; } std::string Utf8ToAnsi(std::string strUTF8) { std::string ret; if (strUTF8.length() > 0) { int nWideStrLength = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0); WCHAR* pwszBuf = (WCHAR*)malloc((nWideStrLength+1)*sizeof(WCHAR)); memset(pwszBuf, 0, (nWideStrLength+1)*sizeof(WCHAR)); MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, pwszBuf, (nWideStrLength+1)*sizeof(WCHAR)); int nAnsiStrLength = WideCharToMultiByte( CP_ACP,0,pwszBuf,-1,NULL,0,NULL,FALSE ); char* pszAnsiBuf = (char*)malloc((nAnsiStrLength+1)*sizeof(char)); memset(pszAnsiBuf, 0, (nAnsiStrLength+1)*sizeof(char)); WideCharToMultiByte(CP_ACP, 0, pwszBuf, -1, pszAnsiBuf, (nAnsiStrLength+1)*sizeof(char), NULL, FALSE); ret = pszAnsiBuf; free(pszAnsiBuf); free(pwszBuf); } return ret; }