Cocos2d-x 绘制中文

在cocos2d-x中要绘制中文。然后我就选择和绘制英文一样的方法进行绘制,结果如下图:

代码如下:

1 CCSize size = CCDirector::sharedDirector()->getWinSize();
2 
3         CCLabelTTF* pLabel = CCLabelTTF::create("世界你好", "Arial", 24);
4 
5         pLabel->setPosition(ccp(size.width / 2, size.height / 2));
6 
7         this->addChild(pLabel, 1);

这是怎么一回事呢?我通过查询各种资料才知道,原来是这么回事:

以创建一个label为例,当我们使用
CCLabelTTF * CCLabelTTF::labelWithString(const char *label, const char *fontName, float fontSize)
来创建label的时候,实际上这里的const char *参数期望的是UTF-8编码的字符串(你可以查看CCImage_win32.cpp中BitmapDC的drawText函数来印证我的说法),如果传入一个非UTF-8编码的字符串,那么创建的label就会显示得不太正常。
注意,这里所说的传入参数的编码是指程序运行时传入的字符串的编码,而不是源文件保存的编码。

好吧,知道了原因就可以来进行解决方案了,解决后如下图:

 

代码如下:

1 CCSize size = CCDirector::sharedDirector()->getWinSize();
2 
3         CCLabelTTF* pLabel = CCLabelTTF::create(UtfToUnicode::Unicode2Utf8(L"世界你好").c_str(), "Arial", 24);
4 
5         pLabel->setPosition(ccp(size.width / 2, size.height / 2));
6 
7         this->addChild(pLabel, 1);

是不是发现和上面的代码基本一样,只是多了一个

UtfToUnicode::Unicode2Utf8(L"世界你好").c_str(), 这句对“世界你好”的转换,我们是把unicode直接转换成utf8就可以实现显示中文了。

下面我把转换的源码放出来大家共享一下。

View Code
  1 #include "UtfToUnicode.h"
  2 
  3 //utf8 转 Unicode
  4 
  5 
  6 std::wstring UtfToUnicode::Utf82Unicode(const std::string& utf8string)
  7 {
  8     int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0);
  9     if (widesize == ERROR_NO_UNICODE_TRANSLATION)
 10     {
 11         throw std::exception("Invalid UTF-8 sequence.");
 12     }
 13     if (widesize == 0)
 14     {
 15         throw std::exception("Error in conversion.");
 16     }
 17 
 18     std::vector<wchar_t> resultstring(widesize);
 19 
 20     int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize);
 21 
 22     if (convresult != widesize)
 23     {
 24         throw std::exception("La falla!");
 25     }
 26 
 27     return std::wstring(&resultstring[0]);
 28 }
 29 
 30 
 31 //unicode 转为 ascii
 32 
 33 
 34 std::string UtfToUnicode::WideByte2Acsi(std::wstring& wstrcode)
 35 {
 36     int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL);
 37     if (asciisize == ERROR_NO_UNICODE_TRANSLATION)
 38     {
 39         throw std::exception("Invalid UTF-8 sequence.");
 40     }
 41     if (asciisize == 0)
 42     {
 43         throw std::exception("Error in conversion.");
 44     }
 45     std::vector<char> resultstring(asciisize);
 46     int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL);
 47 
 48     if (convresult != asciisize)
 49     {
 50         throw std::exception("La falla!");
 51     }
 52 
 53     return std::string(&resultstring[0]);
 54 }
 55 
 56 
 57 
 58 
 59 
 60 //utf-8 转 ascii
 61 
 62 
 63 std::string UtfToUnicode::UTF_82ASCII(std::string& strUtf8Code)
 64 {
 65     std::string strRet("");
 66     //先把 utf8 转为 unicode
 67     std::wstring wstr = Utf82Unicode(strUtf8Code);
 68     //最后把 unicode 转为 ascii
 69     strRet = WideByte2Acsi(wstr);
 70     return strRet;
 71 }
 72 
 73 
 74 ///////////////////////////////////////////////////////////////////////
 75 
 76 
 77 //ascii 转 Unicode
 78 
 79 
 80 std::wstring UtfToUnicode::Acsi2WideByte(std::string& strascii)
 81 {
 82     int widesize = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0);
 83     if (widesize == ERROR_NO_UNICODE_TRANSLATION)
 84     {
 85         throw std::exception("Invalid UTF-8 sequence.");
 86     }
 87     if (widesize == 0)
 88     {
 89         throw std::exception("Error in conversion.");
 90     }
 91     std::vector<wchar_t> resultstring(widesize);
 92     int convresult = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize);
 93 
 94 
 95     if (convresult != widesize)
 96     {
 97         throw std::exception("La falla!");
 98     }
 99 
100     return std::wstring(&resultstring[0]);
101 }
102 
103 
104 //Unicode 转 Utf8
105 
106 
107 std::string UtfToUnicode::Unicode2Utf8(const std::wstring& widestring)
108 {
109     int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL);
110     if (utf8size == 0)
111     {
112         throw std::exception("Error in conversion.");
113     }
114 
115     std::vector<char> resultstring(utf8size);
116 
117     int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL);
118 
119     if (convresult != utf8size)
120     {
121         throw std::exception("La falla!");
122     }
123 
124     return std::string(&resultstring[0]);
125 }
126 
127 
128 //ascii 转 Utf8
129 
130 
131 std::string UtfToUnicode::ASCII2UTF_8(std::string& strAsciiCode)
132 {
133     std::string strRet("");
134     //先把 ascii 转为 unicode
135     std::wstring wstr = Acsi2WideByte(strAsciiCode);
136     //最后把 unicode 转为 utf8
137     strRet = Unicode2Utf8(wstr);
138     return strRet;
139 }
140 
141 UtfToUnicode::UtfToUnicode(void)
142 {
143 }
144 
145 
146 UtfToUnicode::~UtfToUnicode(void)
147 {
148 }

 

posted @ 2013-03-18 09:43  【Winco】  阅读(477)  评论(0编辑  收藏  举报