【原创】完美解决中文乱码 CCLabelTTF

  • 本帖最后由 天使之翼 于 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

编码什么的让人头疼:@

不错 支持下:D

这不是完美的乱码解决方案。

看下面代码:
string content = “中国fuck”;
char labelBuf;
wchar_t buf;
wsprintf(buf, L"%s", content.c_str());
getUTF8_buf((char*)buf, labelBuf, sizeof(labelBuf));
pTTF->setString(labelBuf);

输出的还是乱码

(操作系统是windows7)

mark,果断收藏

— Begin quote from ____

Shawn和月 发表于 2012-12-10 17:20 url

养成不往程序文件里写任何可显示字符串的习惯就好,屏幕显示的字符串和多数数字都从资源文件中获得,就不涉 …

— End quote

问一下怎么使用资源文件呢?

放在Resources目录里的sqlite数据库和各种文件,把它们读出来,只要保件它们是utf-8就行。
来自网络的文件也算,总之是在cpp/h之外的,不被C编译器染指的文件。

直接读资源,读csv或者ini都行

都不是好理法,来写一个类似 android用 xml 管理字符串的:lol

养成不往程序文件里写任何可显示字符串的习惯就好,屏幕显示的字符串和多数数字都从资源文件中获得,就不涉及到用程序来转换的问题了。

— Begin quote from ____

Shawn和月 发表于 2012-12-10 17:20 url

养成不往程序文件里写任何可显示字符串的习惯就好,屏幕显示的字符串和多数数字都从资源文件中获得,就不涉 …

— End quote

嗯,是的啊 ,不过我还没研究 cocos2d-x 管理字符资源的,

mark----------------

编码什么的让人头疼:@

不错 支持下:D

mark,果断收藏

直接读资源,读csv或者ini都行

mark----------------