如何使用 QString toUtf8 和 fromUtf8?
How to use QString toUtf8 and fromUtf8?
我有一个奇怪的问题:
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";
因为您的代码中有未定义的行为:
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()
returns 后被销毁。因此 constData()
指针的有效期足以让函数读取数据。
我有一个奇怪的问题:
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";
因为您的代码中有未定义的行为:
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()
returns 后被销毁。因此 constData()
指针的有效期足以让函数读取数据。