如何使用QString toUtf8和fromUtf8?

时间:2019-05-26 11:33:56

标签: c++ qt qstring

我有一个奇怪的问题:

    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";

1 个答案:

答案 0 :(得分:3)

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

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()指针的有效期足够长,以允许该函数读取数据。