在我的程序中,用户可以通过命令行或使用“QFileDialog”提供文件名。在第一种情况下,我有一个没有任何编码信息的“char *”,在第二种情况下,我有一个“QString”。
为了将文件名存储以备后用(最近使用的文件),我需要它作为“QString”。但是,为了使用“std :: ifstream”打开文件,我需要一个“std :: string”。
现在开始有趣的事情了。我可以做以下操作:
这适用于大多数字符,但并非全部。例如,单词 Раи́са 经过此转换后看起来一样,但实际上包含不同的字符。 因此,我可以拥有一个名为 Раи́са.txt 的文件,它会显示 Раи́са.txt,但在文件系统中却无法找到它。大多数字母都可以正常工作,但 и́ 不行。 (请注意,当文件是在
为了将文件名存储以备后用(最近使用的文件),我需要它作为“QString”。但是,为了使用“std :: ifstream”打开文件,我需要一个“std :: string”。
现在开始有趣的事情了。我可以做以下操作:
filename = QString::fromLocal8Bit(argv[1]);
后来,我可以做:
std::string fn = filename.toLocal8Bit().constData();
这适用于大多数字符,但并非全部。例如,单词 Раи́са 经过此转换后看起来一样,但实际上包含不同的字符。 因此,我可以拥有一个名为 Раи́са.txt 的文件,它会显示 Раи́са.txt,但在文件系统中却无法找到它。大多数字母都可以正常工作,但 и́ 不行。 (请注意,当文件是在
QFileDialog
中选择时,它的效果是正确的。但它从命令行发起时则不行。)
有没有更好的方法来保留文件名?现在,我以任何本地编码方式获取文件名,并且可以在不知道其编码方式的情况下传递它。至少我是这么认为的。
QString filename
中看到了正确的字符串,所以他的codecForLocale
必须设置正确,因为如果调用toLatin1
,特殊字符将被“抑制或替换为问号。” http://qt-project.org/doc/qt-5/qstring.html#toLatin1 - Jonathan Mee