现在的位置: 首页 > 综合 > 正文

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

2018年06月07日 ⁄ 综合 ⁄ 共 2396字 ⁄ 字号 评论关闭

问题源于设置一个窗口的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里面的控件显示中文.有时间搞.

分类: lua

抱歉!评论已关闭.