toUTF8String和本地引用

时间:2013-04-07 09:32:15

标签: c++ icu

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

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);
}

2 个答案:

答案 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的下一次调用可能返回与临时对象完全相同的指针,覆盖了前一个对象。