在用vs开发cocos2dx过程中。要显示的中文,要求是UTF-8格式的才干正常显示出来。但VS通常是ANSI格式保存,这样,在代码中写入的中文字符串,执行后。显示的就是乱码。

为了正确显示中文。或支持多语言,我这里定义一个简单的字符串管理类,来满足上述要求。

这个类使用了我的开源码中的XAnsiString和XMap。TextIni这几个类。能够在我的开放代码找到下载。

以下是代码://字符串资源管理器

#ifndef _X_STRING_MANAGER_H_

#define _X_STRING_MANAGER_H_

#include <xstring.h>

#include <xini.h>

#include <xmap.h>

#include <xset.h>

#include <xsingleton.h>

namespace zdh

{

    typedef XMap<XAnsiString, XAnsiString> TStringKeyValue;

    typedef XMap<XAnsiString, TStringKeyValue> TStringSection;



    class XStringMgr

    {

    public:

        XStringMgr()

        {}

        ~XStringMgr()

        {

            m_Map.Clear();

        }

        XInt Load(const XAnsiString & paramFileName, bool paramClear = true)

        {

            if (paramClear) m_Map.Clear();

            XIniText stIni;

            if (!stIni.Load(paramFileName)) return ERR_FAIL;

            for (int i = 0; i < stIni.getSectionCount(); i++)

            {

                XIniText::TSection * pSection = stIni.getSection(i);

                

                TStringKeyValue & stKeyValue = m_Map[pSection->getSectionName()];

                for (int j = 0; j < pSection->getLength(); j++)

                {

                    XIniText::TEntry * pEntry = pSection->getEntry(j);

                    if (isNULL(pEntry)) continue;

                    if (pEntry->getEntryType() != EIET_COMMON_ENTRY) continue;

                    XIniText::TEntryCommon * pCommonEntry = dynamic_cast<XIniText::TEntryCommon *>(pEntry);

                    if (isNULL(pCommonEntry)) continue;

                    stKeyValue[pCommonEntry->getKey().getField()] = pCommonEntry->getValue().getField();

                }

            }

            return ERR_OK;

        }

        //取指定字符串对象。假设不存在,返回NULL

        const XAnsiString * getStringEx(const XAnsiString & paramSection, const XAnsiString & paramKey)

        {

            int iSectionIndex = m_Map.getIndexBykey(paramSection);

            if (!m_Map.isValidIndex(iSectionIndex)) return NULL;

            const TStringKeyValue & stKeyValue = m_Map.getValue(iSectionIndex);

            int iValueIndex = stKeyValue.getIndexBykey(paramKey);

            if (!stKeyValue.isValidIndex(iValueIndex)) return NULL;

            return &stKeyValue.getValue(iValueIndex);

        }

        //取指定的字符串,假设不存在,则返回空串

        const char * getString(const XAnsiString & paramSection, const XAnsiString & paramKey)

        {

            const XAnsiString * pRet = getStringEx(paramSection, paramKey);

            if (isNULL(pRet)) return "";

            else return pRet->c_str();

        }



        const TStringSection & getMap() const

        {

            return m_Map;

        }



    private:

        TStringSection m_Map;

    };

}

    #define STRING_MGR zdh::XSingletonSample<zdh::XStringMgr, 0>::getInstance()

    #define STRING_SECTION_MAIN "main"

    #define STRING_PLAY (STRING_MGR->getString(STRING_SECTION_MAIN, "play"))

    #define STRING_FONT (STRING_MGR->getString(STRING_SECTION_MAIN, "font"))

#endif

使用样例

    XAnsiString strStringMgrFileName("string_zh.ini");

    if (zdh::isNotOK(STRING_MGR->Load(strStringMgrFileName)))

    {

        STREAM_INFO << "load "<<strStringMgrFileName << "Fail!";

        return false;

    }

    else

    {

        STREAM_INFO << "Load String:" << STRING_PLAY;

    }

[cocos2dx笔记005]一个字符串管理配置类的更多相关文章

  1. [cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类

    用CCLabelTTF显示的数字不好看.于是就想到用图片来代理.眼下网上的实现都是把每一个数字做一个CCSprite组合的方式. 可是我想.动态生成纹理的方式.没有就仅仅好自己手动写一个. 头文件 # ...

  2. struts2学习笔记——第一个struts2应用配置

    说实在的,随着Java学习的不断深入,特别是Java web框架部分,调bug让人很心累,但是每征服一个bug,内心的成就感也是难以言说的.第一个struts2应用的配置,我昨天折腾了快2个小时,最后 ...

  3. spring框架中的一个字符串的工具类

    stringutils.hasText("字符串") 如果字符串里面的值为null, "", "   ",那么返回值为false:否则为tr ...

  4. 开发笔记-记一个基础logback配置

    <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true&q ...

  5. spring 配置 Java配置类装配bean

    https://www.cnblogs.com/chenbenbuyi/p/8457700.html 自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应 ...

  6. C#简单配置类及数据绑定

    目录 简介 配置基类 派生配置类 数据绑定 Winform中的数据绑定 WPF下的数据绑定 附件 简介 本文实现一个简单的配置类,原理比较简单,适用于一些小型项目.主要实现以下功能: 保存配置到jso ...

  7. [cocos2dx笔记012]一定简易的UI配置类

    使用cocostudio能够装载编辑好的UI,可是过于复杂.特别是在加截UI后,发现触屏事件有些问题. 假设直接使用程序写死载入UI又过于麻烦.花点时间,添加了一个基于ini的UI配置类,眼下仅仅实现 ...

  8. 【cocos2d-x 3.x 学习笔记】对象内存管理

    内存管理 内存管理一直是一个不易处理的问题.开发人员必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等.内存管理的核心是动态分配的对象必须保证在使用完成后有效地释放内存,即管理对象的生命周 ...

  9. cocos2d-x lua 实现单例(管理类)

    cocos2d-x lua 实现单例(管理类) version: cocos2d-x 3.6 示例代码 local DogManager = class("DogManager") ...

随机推荐

  1. linux下apache的使用

    Linux安装配置apache http://www.cnblogs.com/fly1988happy/archive/2011/12/14/2288064.html 1.获取软件: http://h ...

  2. 执行Socket socket = new Socket(ip, port);时抛出个异常:android.os.NetworkOnMainThreadException解决办法

    首先,确认你的android版本是4.0之后再用此方法解决,因为在4.0之后在主线程里面执行Http请求才会报这个错,也许是怕Http请求时间太长造成程序假死的情况吧.Android在4.0之前的版本 ...

  3. weblogic.servlet.proxy.HttpProxyServlet 进行代理设置

    1:代理访问服务器应用配置 A:192.168.0.11 B:192.168.0.12 访问:http://192.168.0.11:9001/test/test.jsp 代理服务直接代理访问: ht ...

  4. Laravel.log日志超级大!怎么办!

    备份项目,发现下载好久没有下载下来.提了网速还是下载了45分钟 解压,解压了25分钟. 想着以为是附件太多... 进入了upload发现也就几百兆. 想看里面内容又打不开...  Laravel 的日 ...

  5. ViewPager切换动画效果改动

    比方我们点击向右button,希望左边的view移动过来,有个平移效果,可是用系统默认的ViewPager切换的时候,会一闪而过. 这是为什么呢? 由于viewpager外面事实上有个scrollvi ...

  6. java Socket Tcp 浏览器和服务器(一)

    自定义服务端,使用已有的客户端IE,了解一下客户端给服务端发了什么请求? 发送的请求是: GET / HTTP/1.1  请求行  请求方式  /myweb/1.html  请求的资源路径   htt ...

  7. 用sed替换文件中的空格

    请教sed 替换问题 请教各位如何替换多个空格为一个字符,如一个文件中间隔符有是一个空格,有的地方是多个空格,想全部用“|”替换,如何处理,请指教 请教sed 替换问题 [code]sed '/ \+ ...

  8. easyui panel自适应问题

    项目中要用到easyui,使用也有几年时间了,刚开始使用还不错,毕竟只是简单的增删改查数据,不过到后面越来越觉得easyui不如extjs了,好多复杂一点的问题,easyui表现就力不从心了,题外话就 ...

  9. Java BigDecimal进行精确计算

    前言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以 ...

  10. js ie下有效 showModalDialog 、showModelessDialog

    <input type="button" value="打开选择输入框"/> <script type="text/javascri ...