保留std :: string和QString之间的非ascii字符

时间:2014-11-04 16:59:03

标签: qt character-encoding qstring

在我的程序中,用户可以在命令行上或使用QFileDialog提供文件名。在第一种情况下,我有char*没有任何编码信息,在第二种情况下,我有一个QString

要存储文件名供以后使用(最近的文件),我需要它作为QString。但要使用std::ifstream打开文件,我需要std::string

现在开始有趣了。我能做到:

filename = QString::fromLocal8Bit(argv[1]);

稍后,我可以这样做:

std::string fn = filename.toLocal8Bit().constData();

这适用于大多数角色,但不是全部。例如,经过这次转换后,Раиса这个词看起来会一样,但事实上,它有不同的字符。 因此,虽然我可以有一个Раиса.txt,它将显示Раиса.txt,但它不会在文件系统中找到该文件。大多数字母都有效,但不是。 (请注意,在QFileDialog中选择文件时,它确实可以正常工作。当它来自命令行时,它不会正常工作。)

有没有更好的方法来保存文件名?现在我以任何本机编码获得它,并且可以在不知道的情况下以相同的编码传递。至少我是这么想的。

1 个答案:

答案 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::Filesystemypnos提及File-Streams具体相关。