Cocos2d-x 學習隨記二 Boost::Locale解決中文亂碼問題
阿新 • • 發佈:2019-01-24
問題及處理方案:
一、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)