2009-10-29 82 views
3

下面的代碼不知何故沒有注意到在其名稱中使用非ASCII字符的文件的文件(西裏爾字母,具體):的QDir和QDirIterator忽略與非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上,一切工作正常。

回答

2

從QApplication本身獲取cmd行參數。

所以

QApplication app(argc, argv); 

QStringList args = app.arguments(); 

for(...) 

的Qt將處理編碼正確。但是這隻會解決在cmd行上使用unicode的問題。不知道這是否是你的主要問題。

編輯: fromLocal8Bit()可能不工作,因爲它不是本地編碼,但utf8。所以從uff8()可以在linux和osx上工作(但它不能在windows上工作)。在* nuxes上它取決於一些環境變量(LS_LANG或其他)。我想Qt會將所有內容都考慮在內並將其正確轉換。如果你想確切知道他們做了什麼,你可以看看QApplication的構造器代碼。

+0

很好,它的工作原理。 :-)但是,我不明白這個方法如何或爲什麼起作用,而QString :: fromLocal8Bit(argv [i])不會。 – dpq 2010-01-02 00:18:37

1

哪部分失敗?讀取指定的初始目錄argv[path]或迭代器?如果是前者,則應使用QFile::decodeName將字節字符串轉換爲QString以進行文件處理。默認char* =>QString轉換使用Latin-1,這不是您想要的文件名稱。

+0

兩者都失敗。實際上,當我看到QDirIterator(我在程序中實際需要)不起作用時,我只用QDir編寫了用於測試目的的部分。 – dpq 2009-10-29 08:33:35

0

在構建QStrings時不要使用argv[path]。這將把字符串視爲latin1字符串(它不關心西里爾字符)。嘗試使用

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

在你的循環的頂部,然後用dirName隨處可見,而不是argv[path]

+0

可以預見,它沒有幫助,因爲雖然目錄名稱現在可以正確處理,但其條目的名稱仍然不存在,我還沒有找到解決該問題的方法。 – dpq 2009-10-29 17:52:18

+0

@David:「輸入的名稱沒有正確處理」是什麼意思?在你的例子中,你根本不處理目錄條目。 – 2009-10-29 19:12:44

+0

我這樣做。構造一個QDirIterator,並用next()來遍歷它,會返回其中包含的所有文件的名稱(包括其子目錄中包含的文件的名稱)。那麼,出於某種原因,它只能遍歷名稱可以用latin1表示的文件,這是我的主要問題。 – dpq 2009-10-30 01:06:27