解決Cocos2d-x中文亂碼

讀取外部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文件,這樣可以很方便的快捷的切換游戲語言。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容