• 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; }
  • 相关阅读:
    Uniapp px与rpx的转换
    主流布局Flex
    Uniapp 父组件调用子组件方法给子组件动态传值
    数据仓库(七)——DWD 层
    Kafka Stream
    回溯算法
    数仓重点
    数据仓库(五)——ODS层
    数据仓库(六)——DMI 层
    Spark (二)核心编程
  • 原文地址:https://www.cnblogs.com/yujiaao/p/3691938.html
Copyright © 2020-2023  润新知