• CEGUI的String与C++的std::string互相转换


    问题源于设置一个窗口的userString,即,winmgr:getWindow("winName"):setUserString("AnotherName", "根窗口");然后使用getUserString("AnotherName")来获取这个值的时候,显示的就是乱码.


    CEGUI内部使用utf32编码,可以使用String.data() & String.c_str()来获取对应的utf-8编码string pointer;使用String.ptr()获取的是utf32编码string pointer;
    贴两段代码来看看里面的字节值:
         std::string cppStr("根窗口");
         printf("ASCII 编码. \r\n");
         for (int i = 0; i < cppStr.size(); ++i)
         {
              printf("%X - ", cppStr[i]);
         }
    这一段输出的值如下:
    > ASCII 编码.
    > FFFFFFB8 - FFFFFFF9 - FFFFFFB4 - FFFFFFB0 - FFFFFFBF - FFFFFFDA -

    下面看看关于CEGUI String的代码
         String ceguiStr(cppStr.c_str());
         std::cout << std::endl << "CEGUI str. " << std::endl;
         std::cout << std::endl << " 使用ceguiStr[i]的方式输出." << std::endl;
         for (int i = 0; i < ceguiStr.size(); ++i)
         {
              printf("%X - ", ceguiStr[i]);
         }
    
         std::cout << std::endl << "使用 *(ceguiStr.c_str() + i)的方式输出" << std::endl;
         for (int i = 0; i < ceguiStr.size(); ++i)
         {
              printf("%X - ", *(ceguiStr.c_str() + i));
         }
    
         std::cout << std::endl << "使用 *(ceguiStr.data() + i)的方式输出" << std::endl;
         for (int i = 0; i < ceguiStr.size(); ++i)
         {
              printf("%X - ", *(ceguiStr.data() + i));
         }
    
         std::cout << std::endl << "使用 *(ceguiStr.ptr() + i)的方式输出" << std::endl;
         for (int i = 0; i < ceguiStr.size(); ++i)
         {
              printf("%X - ", *(ceguiStr.ptr() + i));
         }
    

     上面一段代码输出的值如下:

    > CEGUI str.
    >
    > 使用ceguiStr[i]的方式输出.
    > B8 - F9 - B4 - B0 - BF - DA -
    > 使用 *(ceguiStr.c_str() + i)的方式输出
    > FFFFFFC2 - FFFFFFB8 - FFFFFFC3 - FFFFFFB9 - FFFFFFC2 - FFFFFFB4 -
    > 使用 *(ceguiStr.data() + i)的方式输出
    > C2 - B8 - C3 - B9 - C2 - B4 -
    > 使用 *(ceguiStr.ptr() + i)的方式输出
    > B8 - F9 - B4 - B0 - BF - DA -

    可以看出CEGUI的String, c_str() 和 data()函数输出的值是一样的(一个有符号,另一个符号)
    而使用[i]的输出方式则和使用 ptr()函数输出方式一样.看源码处:
         reference     operator[](size_type idx)
         {
              return (ptr()[idx]);
         }
    

     它这个地方也是调用的ptr()这个函数.

    可以看出,调用ptr()输出的值就是你设置的值.但是,ptr()返回的是utf32类型的string pointer. 要转换成char型的string pointer,又不可以直接使用(char*)强制转换.因为强制转换会将utf32的剩下的3个字节值也取,即0值.我写了下面的一个函数来转换.
    char* CEGUIStringToCPPString(CEGUI::String ceguiString)
    {
         char* asciiBuffer = (char*)malloc((ceguiString.size()+1)*sizeof(char));
         memset(asciiBuffer, 0xFF, ceguiString.size()+1);
         for (int i = 0; i < ceguiString.size(); ++i)
         {
              asciiBuffer[i] &= ceguiString[i];
              // 上面就是调用的*(ceguiString.ptr() + i);
         }
         asciiBuffer[ceguiString.size()] = 0;
         return asciiBuffer;
    }
    
    比如这个地方你使用 -- 下面是lua中使用的方法
    win:setUserString("AnotherName","根窗口");     --注意,存储的时候没有转换编码再存储,而是直接存储的ascii的字符串
    print(CEGUIStringToCPPString(win:getUserString("AnotherName"))); --这个地方直接显示的就是:根窗口,而不是乱码了


    至于C++的string转为CEGUI的String,这个很简单, CEGUI::String ceguiString = cppString.c_str();
    其实主要就是CEGUI的String存储方式与CPP的string存储方式不同而已.

    还有一个问题没有没有去try,就是,怎样让CEGUI里面的控件显示中文.有时间搞.

  • 相关阅读:
    增强for循环用法___ArrayList数组实现使用下标最好,LinkedList使用增强型的(转载)
    Java类加载的时机_4种主动引用会触犯类加载+剩下的被动引用不会触发类的加载
    剑指offer_面试题11 数值的整数次方_考察代码的完整性
    深入理解Java虚拟机博客参考目录
    GPU总结(1)
    牛客_Java_值传递(拷贝)不该表原来变量+传引用的话会一起改变
    Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库
    centos7 安装jdk1.8
    JPA
    javaScript获取url中的参数
  • 原文地址:https://www.cnblogs.com/emyueguang/p/2277513.html
Copyright © 2020-2023  润新知