0

我设置了以下代码-

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方面提供建议/帮助。

谢谢!

4

1 回答 1

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 类编写适当的析构函数。您目前肯定会泄漏这些(除非您只是没有共享您的析构函数代码)。

于 2013-06-28T23:26:47.190 回答