最近在学习cocos2d-x,总结了一些开发遇到的问题,希望对和我一样的新手有所帮助。
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,0,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();
}
这是用 cocos2d-x的开发包内置了用于编码转换的iconv库来转化的。
使用:
std::string text = IConvConvert_GBKToUTF8("你好世界");
CCLabelTTF* pLabel = CCLabelTTF::labelWithString(text.c_str(), "Arial", 24);
inline void WStrToUTF8(std::string& dest, const wstring& src){
dest.clear();
for (size_t i = 0; i < src.size(); i++){
wchar_t w = src[i];
if (w <= 0x7f)
dest.push_back((char)w);
else if (w <= 0x7ff){
dest.push_back(0xc0 | ((w >> 6)& 0x1f));
dest.push_back(0x80| (w & 0x3f));
}
else if (w <= 0xffff){
dest.push_back(0xe0 | ((w >> 12)& 0x0f));
dest.push_back(0x80| ((w >> 6) & 0x3f));
dest.push_back(0x80| (w & 0x3f));
}
else if (sizeof(wchar_t) > 2 && w <= 0x10ffff){
dest.push_back(0xf0 | ((w >> 18)& 0x07)); // wchar_t 4-bytes situation
dest.push_back(0x80| ((w >> 12) & 0x3f));
dest.push_back(0x80| ((w >> 6) & 0x3f));
dest.push_back(0x80| (w & 0x3f));
}
else
dest.push_back('?');
}
}
自行转换
使用:
std::string text = WStrToUTF8(L"你好世界");
CCLabelTTF* pLabel = CCLabelTTF::labelWithString(text.c_str(), "Arial", 24);