QDir и QDirIterator игнорируют файлы с именами, отличными от ASCII - PullRequest
3 голосов
/ 29 октября 2009

Следующий код почему-то не замечает файлы с не-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 ]

2 голосов
/ 01 января 2010

Получить параметры строки cmd из самого QApplication.

Так

QApplication app(argc, argv);

QStringList args = app.arguments();

for(...)

Qt будет правильно обрабатывать кодировку. Но это только исправит проблемы с юникодом в строке cmd. Не уверен, что это ваша главная проблема.

EDIT: fromLocal8Bit (), вероятно, не работает, потому что это была не локальная кодировка, а utf8. Таким образом, fromUtf8 () будет работать на Linux и OSX (но не будет работать на Windows). Для * nux это зависит от некоторых переменных окружения (LS_LANG или чего-то еще). Я думаю, Qt все учитывает и правильно конвертирует. Вы можете посмотреть код конструктора для QApplication, если хотите точно знать, что они делают.

1 голос
/ 29 октября 2009

Какая часть выходит из строя? Чтение начальной директории, указанной argv[path] или итератор? Если это первое, вам следует преобразовать байтовые строки в QString для обработки файлов с использованием QFile::decodeName. Преобразование char* => QString по умолчанию использует Latin-1, что не подходит для имен файлов.

0 голосов
/ 29 октября 2009

Не используйте argv[path] просто так при создании QStrings. Это будет обрабатывать строку как строку latin1 (которая не заботится о кириллических символах). Попробуйте использовать

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

в верхней части цикла, а затем используйте dirName везде вместо argv[path].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...