讀取外部xml或者Json文件顯示中文
1.xml方法
使用xml解析中文十分的簡(jiǎn)單,首先我們需要準(zhǔn)備一個(gè)xml文件。如下所示:
<dict>
<key>string1</key>
<string>歡迎學(xué)習(xí)cocos2dx</string>
<key>string2</key>
<string>使用XML顯示中文</string>
<key>string3</key>
<string>key與string標(biāo)簽中的內(nèi)容是對(duì)應(yīng)的</string>
</dict>
在xml文件中,<key>和<string>兩個(gè)標(biāo)簽要保持一一對(duì)應(yīng)的關(guān)系。這樣就可以通過對(duì)key標(biāo)簽中的內(nèi)容索引到對(duì)應(yīng)的中文內(nèi)容,從而顯示中文字符。
需要注意的是保存此xml文件的時(shí)候編碼格式要使用UTF-8(可以使用notepad++或者sublimeText之類的軟件完成)。
之后我們就可以解析xml文件來讀取中文啦:
//創(chuàng)建詞典類實(shí)例,將xml文件加載到詞典中
auto *chnStrings = Dictionary::createWithContentsOfFile("CHN_Strings.xml");
//通過xml文件中的key獲取value
const char *str1 = ((String*)chnStrings->objectForKey("string1"))->getCString();
//創(chuàng)建一個(gè)標(biāo)簽顯示出來
auto* label1 = Label::create(str1, "Arial", 36);
label1->setPosition(320,270);
addChild(label1);
const char *str2 = ((String*)chnStrings->objectForKey("string2"))->getCString();
auto* label2 = Label::create(str2, "Arial", 36);
label2->setPosition(320, 180);
addChild(label2);
const char *str3 = ((String*)chnStrings->objectForKey("string3"))->getCString();
auto* label3 = Label::create(str3, "Arial", 36);
label3->setPosition(320, 90);
addChild(label3)
2.Json方法
Json的方法和xml大同小異,而且更簡(jiǎn)單,首先我們同樣準(zhǔn)備一個(gè)json文件,命名為language.json:
{
"start":"開始游戲",
"setting":"設(shè)置",
"exitGame":"退出游戲",
"info":"馬三小伙兒",
"restart":"重新開始",
"win":"游戲勝利",
"returnMenu":"返回主菜單",
"bgMusic":"背景音樂",
"effectMusic":"音效音量"
}
然后我們使用Jsoncpp庫來讀取json文件,jsoncpp可以到這里去下載:https://sourceforge.net/projects/jsoncpp/ 。解壓之后我們只需要保留其中的src\lib_json和
include\json下的文件,并將其放在項(xiàng)目的Classess\json目錄下。
為了方便使用和修改我們這里創(chuàng)建一個(gè)ReadJson類,這個(gè)類里面只有一個(gè)靜態(tài)的std::string ReadJson::getString(std::string name)方法,用來讀取json信息:
std::string ReadJson::getString(std::string name){
Json::Reader reader;
Json::Value root;
std::string data = FileUtils::getInstance()->getStringFromFile("language.json");
if (reader.parse(data, root, false) == true)
{
return root[name].asCString();
}
}
一步步解釋一下函數(shù)中的內(nèi)容:
Json::Reader 這個(gè)類是用來解析json文件的;
Json::Value 這個(gè)類代表了json的一段數(shù)據(jù);
FileUtils::getInstance()->getStringFromFile("language.json") 這個(gè)函數(shù)用來加載一個(gè)json文件,其返回值是一個(gè)字符串;
調(diào)用reader(Json::Reader類型)的parse函數(shù)開始解析json文件,解析的結(jié)果會(huì)保存在root對(duì)象中(Json::Value類型),讀取它的值很簡(jiǎn)單,就像普通的數(shù)組使用索引一樣,比如root["id"]。然后還可以根據(jù)值的類型進(jìn)行轉(zhuǎn)換,例如:root["name"].asCString();
我們直接在程序中直接調(diào)用這個(gè)類的靜態(tài)函數(shù)就可以方便的讀取json中的字段了。比如:
//開始游戲按鈕
auto start_button = Button::create("button.png");
start_button->setScale(2);
//調(diào)用ReadJson的getString()方法
start_button->setTitleText(ReadJson::getString("start"));
start_button->setTitleFontName("微軟雅黑");
start_button->setTitleFontSize(16);
start_button->setPosition(Vec2(visibleSize.width / 2, visibleSize.height*0.7));
this->addChild(start_button);
使用解析xml或者json還有另外的優(yōu)勢(shì)就可以很方便地支持國(guó)際化。在游戲中設(shè)置一個(gè)語言選擇按鈕,然后根據(jù)選項(xiàng)來決定加載哪個(gè)xml或者json文件,這樣可以很方便的快捷的切換游戲語言。