cocos2dx乱码转中文备忘录

1、在文件菜单中添加“高级保存选项”

工具->自定义->命令->菜单栏->文件->高级保存选项

2、修改符号编码

去文件中选择高级保存选项,选择相应编码


以“UTF-8 无签名”编码方式保存文件会出现代码中的字符串有错误:“ error C2001: 常量中有换行符”。

而以“UTF-8 带签名”编码方式保存文件,文件能够成功运行,但是所有中文字符均为乱码。

对于行尾,若不选择Windows(CR LF)则会出现VS编译问题,原因是window对待”回车“和”换行“的方式可能和其他OS不同。

用带签名方式保存文件后android运行无乱码,所以目前解决方法是暂时不管这个问题。


vs默认源文件的字符集是多字节字符集,既本地化语言字符集,如果你用的系统是中文系统,简体中文,默认字符集是GBK,源码是不包含非ASCLL码。要让其在win32上正常显示,就需要将其转成UTF-8。

解决方法一:函数转换编码

Tools.h

01
02
03
04
05
06
07
08
09
#ifndef _TOOLS_H_
#define _TOOLS_H_
#include "cocos2d.h"
# if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
#include "iconv\iconv.h"
int GBKToUTF8(std::string &gbkStr, const char * toCode, const char * formCode);
#endif
 
#endif


Tools.cpp

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "tools.h"
#include "iconv\iconv.h"
 
# if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
//字符转换,使cocos2d-x在win32平台支持中文显示
int GBKToUTF8(std::string &gbkStr, const char * toCode, const char * formCode)
{
iconv_t iconvH;
iconvH = iconv_open(formCode,toCode);
if (iconvH == 0 )
{
return - 1 ;
}
 
const char * strChar = gbkStr.c_str();
const char ** pin = &strChar;
 
size_t strLength = gbkStr.length();
char * outbuf = ( char *)malloc(strLength* 4 );
char * pBuff = outbuf;
memset(outbuf, 0 ,strLength* 4 );
size_t outLength = strLength* 4 ;
if (- 1 == iconv(iconvH,pin,&strLength,&outbuf,&outLength))
{
iconv_close(iconvH);
return - 1 ;
}
 
gbkStr = pBuff;
iconv_close(iconvH);
return 0 ;
}
/**
**在封装一层,直接传入一个string,转换后还回对应的编码给你
*/
const char * GBKToUTF(std::string &gbkStr)
{
GBKToUTF8(gbkStr, "gbk" , "utf-8" ); //后面两个参数就默认了,免得后面再传参麻烦
 
return gbkStr.c_str();
}
 
#endif



呵呵~ 现在就只要使用GBKToUTF(string &gbkstr),处理后返回对应的编码给你了..
我们再来看怎么使用的...
(注意:对工程右键-> 属性 -> 连接器 -> 输入 -> 附加依赖项 栏目->后面有个按钮,点击打开,换一行加入libiconv.lib,或者在最后空一格加上libiconv.lib也行)

01
02
03
04
05
06
07
08
std::string china= "中文!哈哈" ;
# if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
GBKToUTF8(china, "gbk" , "utf-8" );
#endif
 
CCMenuItem *chinaItem = CCMenuItemFont::create(china.c_str(), this ,NULL);
chinaItem->setPosition(ccp(size.width/ 2 ,size.height/ 2 ));
this ->addChild(chinaItem);








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值