以下代码在某种程度上没有注意到名称中包含非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上,一切正常。
答案 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}}。