1

http://www.icu-project.org/apiref/icu4c/classicu_1_1UnicodeString.html#a05777d826515a20a0b2bb8f4108f9348

StringClass & toUTF8String (StringClass &result) 常量

将 UnicodeString 转换为 UTF-8 并将结果附加到标准字符串。

参数: result 附加了 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);
}
4

2 回答 2

1

该函数toStdString返回一个临时值,如果你不将它存储在某个地方,它就会消失。

在这份声明中

const char* a1 = toStdString("a").c_str();

您将指针存储到此临时对象中。在语句结束时,这个临时字符串再次被销毁,指针不指向任何地方。

稍后尝试使用指针会导致未定义的行为,并且任何事情都可能发生,包括显示其他字符串。

于 2013-04-07T09:48:43.773 回答
0

它与 ICU 无关,而是您正在存储指向临时对象的指针。你打电话时

const char* a1 = toStdString("a").c_str();

toStdString返回一个string对象,然后调用int c_str,它返回一个指向其内容的临时指针。对象销毁后string,指针无效,不应使用。在您的情况下,下一次调用c_str可能返回完全相同的指向临时对象的指针,覆盖前一个。

于 2013-04-07T09:53:59.273 回答