1. 程式人生 > >Cocos2d-x 學習隨記二 Boost::Locale解決中文亂碼問題

Cocos2d-x 學習隨記二 Boost::Locale解決中文亂碼問題

問題及處理方案:

一、Cocos2d-x 引擎編碼格式預設為utf8,而VS開發環境預設為gbk2312,如修改編碼儲存格式為utf8,可以暫時解決亂碼,但存在編譯時錯誤,這跟輸出的字元個數有關。

(解決方案:如報錯可以在字串後加一個字元來解決!) Cocos2d-x引擎文件說可以在最後補後 一個啊 字串。

二、可以從utf8的檔案中讀取字元來解決,這個方案網路都可以搜到。

好處:可以有效的國際化客戶端,如翻譯成多版本客戶,只需要把utf8 格式檔案提供出來,對比翻譯就OK了。

三、利用boost庫來解決亂碼問題,以處理跨平臺問題。

我主要做了如下簡單封裝:

1、在VS開發工程中包含boost目錄。
2、在VS開發工程中包含boost的lib庫目錄。如下圖所示

3、儲存以下程式碼為示例檔案,並新增到工程

//Boost_Tools.h
#ifndef __BOOST_TOOLS_H__
#define __BOOST_TOOLS_H__
#include <boost/locale.hpp>

namespace boosttoolsnamespace
{
	class CBoostTools
	{
	public:
		
		//封裝 string between( string const &text,string const &to_encoding,
		//string const &from_encoding,method_type how = default_method); 
		//直接處理gbk轉utf8編碼
		static std::string gbktoutf8(std::string const &text);
		//直接處理utf8轉gbk
		static std::string utf8togbk(std::string const &text);
		//直接處理big5轉utf8
		static std::string big5toutf8(std::string const &text);
		//直接處理utf8轉big5
		static std::string utf8tobig5(std::string const &text);  
	};

}
#endif

//Boost_Tools.cpp
#include "Boost_Tools.h"

using namespace boost::locale::conv;

//直接處理gbk轉utf8編碼
std::string boosttoolsnamespace::CBoostTools::gbktoutf8(std::string const &text)
{
	//"UTF-8", "GBK"
	std::string const &to_encoding("UTF-8");
	std::string const &from_encoding("GBK");
	method_type how = default_method;
	return boost::locale::conv::between(text.c_str(), text.c_str() + text.size(), to_encoding, from_encoding, how);
}
//直接處理utf8轉gbk
std::string boosttoolsnamespace::CBoostTools::utf8togbk(std::string const &text)
{
	std::string const &to_encoding("GBK");
	std::string const &from_encoding("UTF-8");
	method_type how = default_method;
	return boost::locale::conv::between(text.c_str(), text.c_str() + text.size(), to_encoding, from_encoding, how);
}
//直接處理big5轉utf8
std::string boosttoolsnamespace::CBoostTools::big5toutf8(std::string const &text)
{
	std::string const &to_encoding("UTF-8");
	std::string const &from_encoding("BIG5");
	method_type how = default_method;
	return boost::locale::conv::between(text.c_str(), text.c_str() + text.size(), to_encoding, from_encoding, how);
}
//直接處理utf8轉big5
std::string boosttoolsnamespace::CBoostTools::utf8tobig5(std::string const &text)
{
	std::string const &to_encoding("BIG5");
	std::string const &from_encoding("UTF-8");
	method_type how = default_method;
	return boost::locale::conv::between(text.c_str(), text.c_str() + text.size(), to_encoding, from_encoding, how);
}


4、Cocos2d-x中的程式碼示例如下:

//別忘了包含標頭檔案#include Boost_Tools.h
//直接給create函式傳參就行了,如:boosttoolsnamespace::CBoostTools::gbktoutf8("開始遊戲")
auto label1 = LabelBMFont::create(boosttoolsnamespace::CBoostTools::gbktoutf8("開始遊戲"), "fonts/Bitmapstartmenu.fnt");
label1->setPosition(Point(origin.x + visibleSize.width / 2,
			origin.y + visibleSize.height - label1->getContentSize().height));
label1->setColor(Color3B(255, 255, 0));
this->addChild(label1,2)