【问题标题】:QDir and QDirIterator ignore files with non-ASCII filenamesQDir 和 QDirIterator 忽略具有非 ASCII 文件名的文件
【发布时间】:2009-10-29 06:47:25
【问题描述】:

以下代码不知何故未能注意到名称中包含非 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 上,一切正常。

【问题讨论】:

    标签: qt encoding


    【解决方案1】:

    从 QApplication 本身获取命令行参数。

    所以

    QApplication app(argc, argv);
    
    QStringList args = app.arguments();
    
    for(...)
    

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

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

    【讨论】:

    • 很好,它有效。 :-) 但是,我不明白这种方法如何或为什么起作用,而 QString::fromLocal8Bit(argv[i]) 没有。
    【解决方案2】:

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

    【讨论】:

    • 两者都失败了。实际上,当我看到 QDirIterator(我的程序中实际上需要它)不起作用时,我只是出于测试目的编写了 QDir 的部分。
    【解决方案3】:

    在构造 QStrings 时不要像那样使用argv[path]。这会将字符串视为 latin1 字符串(不关心西里尔字符)。尝试使用

    const QString dirName = QString::fromLocal8Bit( argv[path] );
    

    在循环的顶部,然后在任何地方使用 dirName 而不是 argv[path]

    【讨论】:

    • 可以预见的是,它并没有帮助,因为虽然目录名称现在被正确处理,但它的条目名称仍然没有,而且我还没有找到解决这个问题的方法。
    • @David:“其条目的名称未正确处理”是什么意思?在您的示例中,您根本不处理目录条目。
    • 我愿意。构造一个 QDirIterator 并使用 next() 对其进行迭代会返回(假定)其中包含的所有文件的名称,包括其子目录中包含的文件的名称。好吧,由于某种原因,它只迭代名称可以用 latin1 表示的文件,这是我的主要问题。
    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多