在我的程序中,用户可以在命令行上或使用QFileDialog
提供文件名。在第一种情况下,我有char*
没有任何编码信息,在第二种情况下,我有一个QString
。
要存储文件名供以后使用(最近的文件),我需要它作为QString
。但要使用std::ifstream
打开文件,我需要std::string
。
现在开始有趣了。我能做到:
filename = QString::fromLocal8Bit(argv[1]);
稍后,我可以这样做:
std::string fn = filename.toLocal8Bit().constData();
这适用于大多数角色,但不是全部。例如,经过这次转换后,Раиса这个词看起来会一样,但事实上,它有不同的字符。
因此,虽然我可以有一个Раиса.txt,它将显示Раиса.txt,但它不会在文件系统中找到该文件。大多数字母都有效,但不是。
(请注意,在QFileDialog
中选择文件时,它确实可以正常工作。当它来自命令行时,它不会正常工作。)
有没有更好的方法来保存文件名?现在我以任何本机编码获得它,并且可以在不知道的情况下以相同的编码传递。至少我是这么想的。
答案 0 :(得分:1)
'и'不是ASCII字符,也就是说它没有8位表示。它在argv[1]
中的表示方式取决于操作系统。但它并没有只用一个char
表示。
fromLocal8bit
使用与toLocal8bit
相同的QTextCodec::codecForLocale。正如你所说,std::string
将持有“Раиса.txt”,这不是问题所在。
取决于您的操作系统定义std::ifstream
std::ifstream
虽然char
可能期望每个char
都是自己的std::wstring
,而不是通过操作系统的翻译。因为你看到这个问题,我希望你在Windows上。在这种情况下,您应该使用Microsoft特定的std::fstream
std::wstring
实现:http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx
您可以使用toStdWString
QString
获取{{1}}
有关详细信息,请参阅此处:fstream::open() Unicode or Non-Ascii characters don't work (with std::ios::out) on Windows
编辑:
有权访问它的项目的良好跨平台选项是Boost::Filesystem
。 ypnos提及File-Streams具体相关。