QDir和QDirIterator忽略具有非ASCII文件名的文件

时间:2009-10-29 06:47:25

标签: qt encoding

以下代码在某种程度上没有注意到名称中包含非ASCII字符的文件(特别是西里尔字符):

for (int path = 1; path < argc; path++) {
  QFileInfo fi(argv[path]);
  if (fi.isDir()) {
    QDir dir(argv[path], "", QDir::LocaleAware, QDir::AllEntries);
    qDebug() << dir.entryList();
    QDirIterator it(QString(argv[path]), QDirIterator::Subdirectories);
    while (it.hasNext()) {
      it.next();
      qDebug() << it.fileInfo().absoluteFilePath();
      /* Processing; irrelevant in the context of the question */
    }
  }
}

我到底错在了什么?我该如何处理QDir和QDirIterator让他们知道西里尔文件名?

系统区域设置为en_US.UTF-8

更新:在Windows上,一切正常。

3 个答案:

答案 0 :(得分:2)

从QApplication本身获取cmd行参数。

所以

QApplication app(argc, argv);

QStringList args = app.arguments();

for(...)

Qt会正确处理编码。但这只会解决cmd行上unicode的问题。不确定这是否是你的主要问题。

编辑: fromLocal8Bit()可能不起作用,因为它不是本地编码,而是utf8。因此fromUtf8()可以在linux和osx上运行(但它不适用于Windows)。在* nuxes上它取决于一些环境变量(LS_LANG或其他)。我想Qt会考虑所有因素并将其正确转换。如果您想确切知道它们的作用,可以查看QApplication的构造函数代码。

答案 1 :(得分:1)

哪部分失败了?读取指定argv[path]的初始目录或迭代器?如果是前者,则应使用QString将字节字符串转换为QFile::decodeName以进行文件处理。默认char* =&gt; QString转换使用Latin-1,这不是您想要的文件名。

答案 2 :(得分:0)

在构建QStrings时,不要像使用argv[path]那样使用const QString dirName = QString::fromLocal8Bit( argv[path] ); 。这会将字符串视为latin1字符串(不关心西里尔字符)。尝试使用

dirName

位于循环顶部,然后在任何地方使用argv[path]代替{{1}}。