我设置了以下代码 -
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 。
谢谢!
答案 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类编写适当的析构函数。你肯定是在泄漏这些(除非你只是没有共享你的析构函数代码)。