StringClass& toUTF8String(StringClass& result)const
将UnicodeString转换为UTF-8并将结果附加到标准字符串。
参数:结果 标准字符串(或兼容对象) 附加了字符串的UTF-8版本。
返回: 字符串对象。
// My own function.
string toStdString(const UnicodeString& a_str)
{
string str;
a_str.toUTF8String(str);
return (str);
}
int main (void)
{
string a = toStdString("a");
string b = toStdString("b");
cout << "a:" << a << endl; // a
cout << "b:" << b << endl; // b
const char* a1 = toStdString("a").c_str();
const char* b1 = toStdString("b").c_str();
cout << "a1:" << a1 << endl; // b !!! Problem: Why not "a"?
cout << "b1:" << b1 << endl; // b
const char* a2 = a.c_str();
const char* b2 = b.c_str();
cout << "a2:" << a2 << endl; // a
cout << "b2:" << b2 << endl; // b
return (0);
}
答案 0 :(得分:1)
函数toStdString
返回一个临时函数,如果你不将它存储在某个地方就会消失。
在本声明中
const char* a1 = toStdString("a").c_str();
将指针存储到此临时对象中。在语句结束时,这个临时字符串再次被销毁,指针指向任何地方。
稍后尝试使用指针会导致未定义的行为,并且可能发生任何事情,包括显示其他字符串。
答案 1 :(得分:0)
它与ICU无关,而是存储指向临时对象的指针。当你打电话
const char* a1 = toStdString("a").c_str();
toStdString
返回一个string
对象,然后在int上调用c_str
,它返回一个指向其内容的临时指针。销毁string
对象后,指针无效,不应使用。在您的情况下,对c_str
的下一次调用可能返回与临时对象完全相同的指针,覆盖了前一个对象。