【问题标题】:How to use QString toUtf8 and fromUtf8?如何使用 QString toUtf8 和 fromUtf8?
【发布时间】:2019-10-12 06:21:34
【问题描述】:

我有一个奇怪的问题:

    QString s1="abc";
    const char * ss1=s1.toUtf8().constData();
    QString s2=QString::fromUtf8(ss1);
    if(s1==s2)
      qDebug()<<"s1==s2";
    else
      qDebug()<<"s1!=s2";

上述代码的输出是“s1!=s2”。其实ss1和s2的内容是乱七八糟的。但是下面代码的输出是“s1==s2”。为什么?

    QString s1="abc";
    QString s2=QString::fromUtf8(s1.toUtf8().constData());
    if(s1==s2)
      qDebug()<<"s1==s2";
    else
      qDebug()<<"s1!=s2";

【问题讨论】:

    标签: c++ qt qstring


    【解决方案1】:

    因为您的代码中有未定义的行为:

    const char * ss1 = s1.toUtf8().constData();
    

    toUtf8() 函数返回的 QByteArray 是一个临时对象,已被销毁。但是您保留了指向其数据的指针,然后您尝试使用:

    QString s2=QString::fromUtf8(ss1);
    

    这会导致未定义的行为。

    为此,您需要保持临时 QByteArray 对象处于活动状态。您可以为此使用 const 参考。它将延长临时对象的寿命:

    QString s1 = "abc";
    const auto& bytes = s1.toUtf8();
    const char * ss1 = bytes.constData();
    

    你的第二个例子很好,因为你没有使用任何指向被破坏对象内部内存的指针:

    QString s2 = QString::fromUtf8(s1.toUtf8().constData());
    

    toUtf8() 返回的临时 QByteArray 对象仅在调用fromUtf8() 返回之后 被销毁。所以constData() 指针的有效时间足以让函数读取数据。

    【讨论】:

    • 谢谢!@Nikos C.
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2017-11-20
    • 1970-01-01
    • 2011-09-02
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多