将QString转换为const char时不可预测的运行时行为*

时间:2013-06-28 23:20:48

标签: c++ qt pointers character-encoding

我设置了以下代码 -

class ID3{
    const char* fileName;
    TagLib::FileRef *file;

public:
    ID3(const char *);
    QImage* artwork();
}

ID3::ID3(const char* fileNameStr){
    this->fileName = fileNameStr;
    this->file = new TagLib::FileRef(fileNameStr);
    qDebug()<<fileNameStr;                                   //OUTPUT 2
}

QImage* ID3::artwork(){
    QString str = QString::fromLocal8Bit(this->fileName);
    qDebug()<<str;                                           //OUTPUT 3
    //MORE CODES-------
}

const char * QstrTocChar(QString str){
    QByteArray ba = str.toLocal8Bit();
    qDebug()<<ba.constData();                                //OUTPUT 1
    return ba.constData();
}


int main(int argc, char *argv[]){
             .
             .
             .
    QString fileName = "C:/Qt/Qt5.0.2/Projects/taglib_test/music files/Muse_-_Madness.mp3";

    file = new ID3(QstrTocChar(fileName));
    QImage *image = file->artwork();
}

现在,当我运行程序时,我得到了这些奇怪的输出

输出1

C:/Qt/Qt5.0.2/Projects/taglib_test/music files/Muse_-_Madness.mp3 

输出2

????p???e'2/ 

输出3

"°í³àpµ˜Æe'2/" 

不确定 OUTPUT 2 ,但我希望OUTPUT 3与 OUTPUT 1 相同。我是Qt新手。非常感谢建议/帮助理解,这些奇怪的字符编码问题以及如何修复 OUTPUT 3

谢谢!

1 个答案:

答案 0 :(得分:2)

ba.constantData()返回一个指向数据的指针,该指针在QstrToChar完成执行时无效(8位转换的QByteArray),当QstrToChar完成时,你剩下的都是免费的垃圾。

如果你刚刚做了什么:

file = new ID3(fileName.toLocal8Bit().constData());

在你的主程序中?

实际上,您可能仍需要将自己的数据副本保存在私人ID3 char *中,因为它可以消除这些临时数据。

你的代码应该是这样的,而不是:

class ID3{
    std::string fileName;
    std::smart_ptr<TagLib::FileRef> file;

public:
    ID3(std::string);
    QImage* artwork();
}

ID3::ID3(std::string fileNameStr) {
    this->fileName = fileNameStr;
    this->file.reset(new TagLib::FileRef(fileNameStr));
    qDebug()<<fileNameStr;                                   //OUTPUT 2
}

QImage* ID3::artwork(){
    QString str = QString::fromLocal8Bit(this->fileName);
    qDebug()<<str;                                           //OUTPUT 3
    //MORE CODES-------
}

std::string QstrToCppString(QString str){
    QByteArray ba = str.toLocal8Bit();
    qDebug()<<ba.constData();                                //OUTPUT 1
    return std::string(ba.constData());
}


int main(int argc, char *argv[]){
             .
             .
             .
    QString fileName = "C:/Qt/Qt5.0.2/Projects/taglib_test/music files/Muse_-_Madness.mp3";

    file = new ID3(QstrToCppString(fileName));
    QImage *image = file->artwork();
}

请注意,我已经将您的TagLib :: FileRef包装在一个smart_ptr中,因为您正在新建它,您需要管理内存。另一种方法是为您的ID3类编写适当的析构函数。你肯定是在泄漏这些(除非你只是没有共享你的析构函数代码)。