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

在做跨平台开发的过程中,通常会遇到中文乱码问题。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字符串转化为utf8
void 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());

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值