【转载】cocos2d-x 2.1下使用CCLabelTTF显示汉字的问题

【转载】cocos2d-x 2.1下使用CCLabelTTF显示汉字的问题,第1张

概述http://blog.itpub.net/14466241/viewspace-752027/ 作者:朱先忠 本文结合自己的学习结果,并主要参考如下内容形成: http://blog.csdn.net/tkokof1/article/details/7426706(移动开发之浅析cocos2d-x的中文支持问题 ) http://bbs.csdn.net/topics/390285784(coc

http://blog.itpub.net/14466241/viewspace-752027/

作者:朱先忠


本文结合自己的学习结果,并主要参考如下内容形成:

http://blog.csdn.net/tkokof1/article/details/7426706(移动开发之浅析cocos2d-x的中文支持问题
http://bbs.csdn.net/topics/390285784(cocos2d-x 2.0 iconv.h问题)
在我前面的一篇文章中,曾经记下了一种使用cclabelBMFont,结合BMFont字体编辑器软件在AndroID及Win32平台上显示汉字的技术。
但是,感觉上面这种方案还是明显存在不足。
首先,需要把使用到的汉字全部整理到一个UNICIDE编码的文本文件中(在开发过程中,这个文件的内容可能需要不断地修改)。这一步倒也不算怎么麻烦。
然后,使用BMFont字体编辑器软件导入上面UNICODE 编码的文本文件,并生成字体文件.fnt。
再接下来,把上面的文字根据需要分块整理到UNICODE编码的XML文件中。
最后,在程序中调用并解析上面的XML文件,并结合.fnt文件,显示中文。



接下来要介绍的是使用cclabelTTF显示汉字的问题。这种方案速度更快,在AndroID及Win32平台上显示汉字自然也没有问题。相关技术主要来自于:
http://blog.csdn.net/tkokof1/article/details/7426706
我只是稍微整理了一下而已。
方案一:使用cocos2d-x自带的iconv库(在WIN32下),还要下载一个。
需要:
1,在你的工程中添加对头文件cocos2dx\platform\third_party\win32\iconv\iconv.h的引用。
2,相应的库引用:cocos2dx\platform\third_party\win32\librarIEs\libiconv.lib。
代码如下:(先写两个工具函数)
bool IConvConvert(const char *from_charset,const char *to_charset,const char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd = iconv_open(to_charset,from_charset);
if (cd == 0) return false;
const char **pin = &inbuf;
char **pout = &outbuf;
memset(outbuf,outlen);
size_t ret = iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
iconv_close(cd);
return ret == (size_t)(-1) ? false : true;
}
std::string IConvConvert_GBKToUTF8(const std::string& str)
const char* textIn = str.c_str();
char textout[256];
bool ret = IConvConvert("gb2312","utf-8",textIn,strlen(textIn),textout,256);
return ret ? string(textout) : string();
使用方法简单:
std::string text = IConvConvert_GBKToUTF8("你好世界");
cclabelTTF* pLblChinese = cclabelTTF::create(text.c_str(),"Arial",24);
但是,遗憾的是, cocos2d-x 仅自带了适合于WIN32的 iconv 库,对于其中平台的没有带。
不过,不要紧,上面提到的iconv库可以轻松搞到。具体细节在http://bbs.csdn.net/topics/390285784上有介绍。我把它摘要在此:
问题已解决,现给出解决方案:
下一个iconv库放到跟Classes同级目录,然后在iconv库根目录下编写AndroID.mk文件,内容:
LOCAL_PATH:=$(callmy-dir)
#libiconv.so
include$(CLEAR_VARS)
LOCAL_MODulE:=libiconv
LOCAL_CFLAGS:=\
-Wno-multichar\
-DAndroID\
-DliBDIR="c"\
-DBUILDING_liBICONV\
-DIN_liBRARY

LOCAL_SRC_fileS:=\
libcharset/lib/localcharset.c\
lib/iconv.c\
lib/relocatable.c

LOCAL_C_INCLUDES+=\
$(LOCAL_PATH)/include\
$(LOCAL_PATH)/libcharset\
$(LOCAL_PATH)/lib\
$(LOCAL_PATH)/libcharset/include\
$(LOCAL_PATH)/srclib
include$(BUILD_STATIC_liBRARY)

在Classes目录下的AndroID.mk文件里加入:
LOCAL_C_INCLUDES+=\
$(LOCAL_PATH)/../iconv/include\
$(LOCAL_PATH)/../libiconv/libcharset\
$(LOCAL_PATH)/../libiconv/lib\
$(LOCAL_PATH)/../libiconv/libcharset/include\
$(LOCAL_PATH)/../libiconv/srclib\
$(LOCAL_PATH)/../iconv

LOCAL_WHolE_STATIC_liBRARIES+=libiconv

$(callimport-module,iconv)

这样就可以了~~

方案二:结合上面原理,自己开发(极力推荐)

//!convertfromwstringtoUTF8usingself-Coding-converting

inlinevoIDWStrToUTF8(std::string&dest,constwstring&src){

dest.clear();

for(size_ti=0;i<src.size();i++){

wchar_tw=src[i];

if(w<=0x7f)

dest.push_back((char)w);

elseif(w<=0x7ff){

dest.push_back(0xc0|((w>>6)&0x1f));

dest.push_back(0x80|(w&0x3f));

}

elseif(w<=0xffff){

dest.push_back(0xe0|((w>>12)&0x0f));

dest.push_back(0x80|((w>>6)&0x3f));

elseif(sizeof(wchar_t)>2&&w<=0x10ffff){

dest.push_back(0xf0|((w>>18)&0x07));//wchar_t4-bytessituation

dest.push_back(0x80|((w>>12)&0x3f));

else

dest.push_back('?');

//!simplewarpper

inlinestd::stringWStrToUTF8(conststd::wstring&str){

std::stringresult;

WStrToUTF8(result,str);

returnresult;

//addalabelshows"HelloWorld"

//createandinitializealabel

std::stringtext=WStrToUTF8(L"你好世界");

cclabelTTF*pLabel=cclabelTTF::labelWithString(text.c_str(),24);


总结 上面几种方案我都试验过了,OK。
剩下还有一个问题就是,使用cclabelTTF显示中文时,如何使用自定义字体的问题了。以后再讨论................

--the end


因为需要修改一个RichText,所以再次找到了显示中文的问题。

总结

以上是内存溢出为你收集整理的【转载】cocos2d-x 2.1下使用CCLabelTTF显示汉字的问题全部内容,希望文章能够帮你解决【转载】cocos2d-x 2.1下使用CCLabelTTF显示汉字的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1067395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存