现在的位置: 首页 > 综合 > 正文

cocos2dx 3.0 windows平台 中文乱码解决

2018年04月02日 ⁄ 综合 ⁄ 共 2218字 ⁄ 字号 评论关闭

From:

http://www.cnblogs.com/yujiaao/p/3691938.html

 

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

 

抱歉!评论已关闭.