【cocos2dx】rapidjson使用方法以及中文显示的解决方法
2014-02-18 22:28
726 查看
方法已更新,请移步新的地址:【cocos2dx】rapidjson使用方法以及中文显示的解决方法【续】
新版cocos2dx使用了rapidjson库来替换原来的jsoncpp。
解析速度提高了不少,但是好像没有那么方便。
今天想做一个读取中文数据的类。
磨磨蹭蹭也转了不少弯路,终于搞出来了一个可用的,数据使用JSON存储,下面是存储的数据
然后解析的类在这里,先是头文件ReadString.h
然后是实现文件ReadString.cpp
我比较喜欢把解释全写在代码里面
使用方法很简单
之后用来干什么都可以啦
这种方法的缺陷就是字符串添加比较麻烦,不过cocostudio的数据编辑器可以把excel的数据转换成json,方便一些。
唯一感觉比较麻烦的就是 宏定义需要自己维护
新版cocos2dx使用了rapidjson库来替换原来的jsoncpp。
解析速度提高了不少,但是好像没有那么方便。
今天想做一个读取中文数据的类。
磨磨蹭蹭也转了不少弯路,终于搞出来了一个可用的,数据使用JSON存储,下面是存储的数据
{"chinese":[{"ID":1,"String":"五子棋"},{"ID":2,"String":"当前玩家:"},{"ID":3,"String":"黑色方"},{"ID":4,"String":"白色方"},{"ID":5,"String":"选择玩家"},{"ID":6,"String":"失败"},{"ID":7,"String":"胜利"}]}
然后解析的类在这里,先是头文件ReadString.h
#pragma once #include "cocos2d.h" #include <string> #include <cocos-ext.h> #include "cocostudio\CocoStudio.h" #include "gui\CocosGUI.h" /** * 数据ID的宏定义,用于找到中文数据 */ #define S_GOBANG 1 #define S_NOWPLAY 2 #define S_BLACK 3 #define S_WHITE 4 #define S_CHOOSEPLAYER 5 #define S_FAIL 6 #define S_WIN 7 class ReadString { public: static ReadString* creat(char * fileName); static ReadString* getInstance(); ~ReadString(void); std::string read(int key); private: ReadString(char * fileName); std::string Beffer; //暂存的数据 static ReadString* rs; };
然后是实现文件ReadString.cpp
#include "ReadString.h" using namespace std; using namespace cocostudio; ReadString* ReadString::rs = nullptr; //初始化 ReadString::ReadString(char * fileName) { auto File = cocos2d::FileUtils::getInstance(); string sFullPath = File->fullPathForFilename(fileName); Beffer = File->getStringFromFile(sFullPath); } ReadString* ReadString::creat(char * fileName) { ReadString *RS = new ReadString(fileName); return RS; } ReadString* ReadString::getInstance() { if(rs == nullptr) rs= ReadString::creat("String.json"); return rs; } string ReadString::read(int key) { rapidjson::Document d; d.Parse<0>(Beffer.c_str()); if (d.HasParseError()) //解析错误 { CCLOG("GetParseError %s\n",d.GetParseError()); } else if (d.IsObject()&&d.HasMember("chinese"))//这个时候要保证d.IsObject类型 { const rapidjson::Value &a=d["chinese"]; //读取中文的数组 if (a.IsArray()) //判断是不是数组 { for(unsigned int i=0;i<a.Size();++i) //如果不是数组,这一行会报错 { const rapidjson::Value &val = a[i]; //得到单个对象 if(val.HasMember("ID")) //判断这个对象有没有id键 { const rapidjson::Value &val_id = val["ID"]; //获取ID int i_id = -1; if(val_id.IsInt()) //判断ID类型 { i_id = val_id.GetInt(); if(i_id == key) //如果ID与传入参数相同,则读取String键的内容 { if(val.HasMember("String")) if(val["String"].IsString()) return val["String"].GetString(); } } } } } } else return ""; //没查找到任何对象则返回空字符串 } ReadString::~ReadString(void) { }
我比较喜欢把解释全写在代码里面
使用方法很简单
ReadString* rs = ReadString::getInstance(); //先获取静态类 std::string s_title = rs->read(S_GOBANG);//得到五子棋这个字符串
之后用来干什么都可以啦
这种方法的缺陷就是字符串添加比较麻烦,不过cocostudio的数据编辑器可以把excel的数据转换成json,方便一些。
唯一感觉比较麻烦的就是 宏定义需要自己维护
相关文章推荐
- 【cocos2dx】rapidjson使用方法以及中文显示的解决方法【续】
- 在使用Gson的toJson()方法转为json字符串的时候无法显示中文和符号的问题(已解决)
- cocos2d-x中文显示问题解决方法(使用cocos2dx中自带的iconv实现)
- cocos2d-x中文显示问题解决方法(使用cocos2dx中自带的iconv实现)
- Ubuntu 配置VNC以及使用VNC连接时,无法显示系统菜单栏,解决方法
- Ubuntu 16.04 下使用FileZilla工具无法显示中文目录及文件名的解决方法
- php使用mysql数据库时中文不显示或显示异常解决方法
- php使用json_encode后出现中文乱码的解决方法
- spring boot新手教程之使用FastJson解析JSON数据以及解决返回中文乱码问题
- 崩溃,source Insight显示linux代码中文注释乱码问题,以及很傻很天真的解决方法
- 使用英文网站模板建站,修改为中文时不显示的解决方法。
- ajax跨域,使用json,crossDomain,请求返回状态200,但是走的error的原因以及解决方法
- 这两天使用jquery-mobile写手机页面遇到的append样式不生效,以及listview内容显示不完解决方法
- 使用java mail 包收发中文邮件的编码,解码问题以及解决方法
- SpringMVC使用注解@ResponseBody返回json以及中文乱码问题解决
- Springboot使用FastJson中文乱码解决方法。
- javascript json的使用(以及中文乱码的解决乱码)
- jpgraph的使用以及标题和图例中文乱码的源码解决方法