我遇到QDir从我的文件名中丢失非Ascii字符的问题。
我的文件名为testingöäüß.txt或exampleΦ.shp,当尝试使用QDir和QFile等Qt实用程序时,它们只显示为testing.txt和example.shp。好像我无法告诉那些类使用什么样的编码。我正在尝试QDirIterator和QDir函数entryInfoList:
QDir someDir("/home/blah"); //contains testingöäüß.txt
QDirIterator dirIter(someDir.absolutePath(), QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files);
while(dirIter.hasNext())
{
QString fileName1 = QFile::decodeName(dirIter.next().toUtf8());
std::cout << "QDirIterator Name " << fileName1.toStdString().c_str() << std::endl;
}
QFileInfoList fileInfoList = someDir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files);
foreach(QFileInfo fileInfo, fileInfoList)
{
QString fileName1 = QFile::decodeName(fileInfo.fileName().toUtf8());
std::cout << "entryInfoList Name " << fileName1.toStdString().c_str() << std::endl;
QString fileName2 = QFile::decodeName(fileInfo.absoluteFilePath().toUtf8());
std::cout << "entryInfoList Name2 " << fileName2.toStdString().c_str() << std::endl;
QString fileName3 = QString::fromUtf8(dirIter.fileInfo().absoluteFilePath().toStdString().c_str());
std::cout << "entryInfoList Name3 " << fileName3.toStdString().c_str() << std::endl;
}
这些印刷品中的每一个都缺少非ascii字符。似乎只要你试图抓住文件名循环它们就会只是ascii。任何人对此都有任何想法?或者Qt根本不能处理这个?谢谢!
答案 0 :(得分:0)
Qt可以处理带有特殊字符的文件名。你只是让它们在字符串转换的东西中消失。 (完全没必要)试试这个:
#include <QDebug>
//...
QFileInfoList fileInfoList = someDir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files);
foreach(QFileInfo fileInfo, fileInfoList)
{
qDebug() << fileInfo.fileName();//uses qdebug
std::cout << fileInfo.fileName().toStdWString() << std::endl;//uses a 16Bit string on normal cout
}
如果您仍然没有看到它们,那是因为您的控制台设置不允许显示它们。尝试将它们写入文件或在gui中显示它们 - 或者只是尝试打开具有该名称的文件,它将起作用。