- 本帖最后由 天使之翼 于 2012-12-10 13:30 编辑 *
鉴于网上的一些解方案都不方便(也许我没找到)自己研究了一个方法,
其实原理就是将字符串转为 UFT8,
C++ 里面默认的字符编码是 GB2312 769有图有真相
,而coco2d-x 支持的编码是 UTF8, 所以放中文会有乱码。好在 C++ 支持标志 L 将字符串编译成 unicode(L"中国"),unicode 转UTF8就方便了,关于这些编码之间的关系,我觉得作为一个合格的程序员必须搞清楚,自己百度去吧!
下面附上转换方法:(纯 C 做的,我喜欢 C)
//将Unicode小端转为UTF8
int UCS2LEToUTF8(const uint8 *unicode, uint8 *utf8, int size)
{
int u = 0, i = 0;
while((unicode || unicode) && i <= size-3) //i <= size-3 最多占3个字节,保件缓冲区不越界
{
if(unicode < 128 && unicode == 0)
{
// 0 - 7 bits
utf8* = unicode;
}else if((unicode & 0xf8) == 0){
// 8 - 11 bits
utf8* = 0xc0 | (unicode << 2) | (unicode >> 6);
utf8* = 0x80 | (unicode & 0x3f);
}else{
// 12 - 16 bits
utf8* = 0xe0 | (unicode >> 4);
utf8* = 0x80 | ((unicode & 0x0f) << 2) | (unicode >> 6);
utf8* = 0x80 | (unicode & 0x3f);
}
u+=2;
}
utf8* = 0;
return i;
}*******封装方法:
const char *getUTF8_buf(const char *unicode, char *buf, int bufSize)
{
UCS2LEToUTF8((uint8 *)unicode, (uint8 )buf, bufSize);
return (const char)buf;
}
static int wstrlen(const char unicode)
{
int i = 0;
while(unicode || unicode*) // unicode 00 结尾
i += 2;
return i/2;
}
const char *getUTF8(const char *unicode)
{
int l = wstrlen(unicode)3 + 1; //一个unicode字符 转为 UTF8 最多3字节(更多的忽略它)
uint8 buf = (uint8 )malloc(l);
return getUTF8_buf(unicode, (char)buf, l);
}
使用方法:
label = CCLabelTTF::create(getUTF8_buf((const char*)L"中国", labelBuf, sizeof(labelBuf)), “Marker Felt”, 30);
void UILayer::updateScore(int s)
{
wchar_t buf;
wsprintf(buf, L"位置:%d 米", s);
//sprintf(labelBuf, "%d", s);
getUTF8_buf((char*)buf, labelBuf, sizeof(labelBuf));
label->setString(labelBuf);
}
770