cocos2d-x解決中文亂碼問題的幾種辦法


  1. 將源代碼文件保存爲utf8編碼,不過因爲編譯器的問題,這種方式會致使不少沒法預測的問題 windows

  2. 將字符串用utf8編碼集中存到一文件中,而後用代碼讀取這些字符串來使用,這種辦法還能很好的支持多語言版本 ide

  3. 使用字符串時,先將其轉換爲utf8編碼 函數


我最終使用了第三種方法,第一種撇開不說,第二種實現起來比較麻煩,第三種則要方便不少。 編碼


通常在windows上,咱們使用API MultiByteToWideChar來進行各類編碼轉換。 spa

不過這東西只能在Windows上用,在cocos2d-x上用就有點不合時宜的感受,畢竟安卓上可沒這個API。 code

還好cocos2d-x考慮很周到,它自帶了一個iconv庫 utf-8

只須要在項目附加依賴項里加入libiconv.lib,而且包含頭文件iconv/iconv.h便可使用。 ci

我經過這個庫封裝了幾個編碼轉換的函數,代碼以下 字符串


1
2
3
4
5
6
7
8
9
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 "Tool.h"
     
int code_convert(const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
    iconv_t cd;
    const char *temp = inbuf;
    const char **pin = &temp;
    char **pout = &outbuf;
    memset(outbuf,0,outlen);
    cd = iconv_open(to_charset,from_charset);
    if(cd==0) return -1;
    if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
    iconv_close(cd);
    return 0;
}
     
/*UTF8轉爲GB2312*/
std::string u2a(const char *inbuf)
{
    size_t inlen = strlen(inbuf);
    char * outbuf = new char[inlen * 2 + 2];
    std::string strRet;
    if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
    {
        strRet = outbuf;
    }
    delete [] outbuf;
    return strRet;
}
     
/*GB2312轉爲UTF8*/
std::string a2u(const char *inbuf)
{
    size_t inlen = strlen(inbuf);
    char * outbuf = new char[inlen * 2 + 2];
    std::string strRet;
    if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
    {
        strRet = outbuf;
    }
    delete [] outbuf;
    return strRet;
}


而後在每次要使用中文前,用a2u函數將文本轉換爲utf-8編碼,使用例程以下: 編譯器


1
2
3
4
//刷新分數顯示
char buff[1024];
sprintf_s(buff, 1024, "得分:%d", _Score);
_pLabelScore->setString(a2u(buff).c_str());


至此,咱們能夠在cocos2d-x中正常顯示中文了!


相關文章
相關標籤/搜索