Cocos2dx杂记:如何显示中文(2)

来源:互联网 发布:2017淘宝蓝海产品 编辑:程序博客网 时间:2024/05/22 07:41

在做跨平台开发的过程中,通常会遇到中文乱码问题。cocos2dx vs工程,C++源文件默认的就是ANSI编码,在编译到Android上运行的时候会出现乱码。在前面介绍过通过Plist文件读取的方式,可以实现中文的显示。这里介绍通过代码的形式实现该功能。

一、源程序
Tools.h

#include <string>using namespace  std;class Tools {public:    //wstring字符串转化为utf8    static void WStrToUTF8(string &dest, const wstring &src);    //传入参数为string类型    static string ConvertStrToUTF8(const string &str);    //传入参数为wstring类型    static string ConvertStrToUTF8(const wstring &str);    //将string类型转换为wstring类型    static std::wstring StringToWstring(const std::string str, const std::string = "chs");    //将wstring类型转换为string类型    static std::string WstringToString(const std::wstring str, const std::string = "chs");};

Tools.cpp

#include "Tools.h"#include <cstdlib>#include <time.h>#include <string>#include <locale.h> //wstring字符串转化为utf8void Tools::WStrToUTF8(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('?');    }}//传入参数为string类型string Tools::ConvertStrToUTF8(const string &str) {    string result;    WStrToUTF8(result, StringToWstring(str));    return result;}//传入参数为wstring类型string Tools::ConvertStrToUTF8(const wstring &str) {    string result;    WStrToUTF8(result, str);    return result;}//将string类型转换为wstring类型, 需包含locale、string头文件、使用setlocale函数。std::wstring Tools::StringToWstring(const std::string str, const std::string loc){    setlocale(LC_ALL, loc.c_str());    const char* _Source = str.c_str();    size_t _Dsize = str.size() + 1;    wchar_t *_Dest = new wchar_t[_Dsize];    wmemset(_Dest, 0, _Dsize);    mbstowcs(_Dest, _Source, _Dsize);    wstring result = _Dest;    delete[]_Dest;    setlocale(LC_ALL, "C");    return result;}//将wstring类型转换为string类型std::string Tools::WstringToString(const std::wstring str, const std::string loc){    string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";    setlocale(LC_ALL, loc.c_str());    const wchar_t* _Source = str.c_str();    size_t _Dsize = 2 * str.size() + 1;    char *_Dest = new char[_Dsize];    memset(_Dest, 0, _Dsize);    wcstombs(_Dest, _Source, _Dsize);    string result = _Dest;    delete[]_Dest;    setlocale(LC_ALL, curLocale.c_str());    return result;}

二、使用方法

    const std::wstring str = L"中文测试,你好,世界!";    log("str = %s", Tools::ConvertStrToUTF8(str).c_str());    const std::string str1 = "中文测试,你好,世界!";    log("str1 = %s", Tools::ConvertStrToUTF8(str1).c_str());

这里写图片描述