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