gpt4 book ai didi

qt - 在 std::string 和 QString 之间保留非 ascii 字符

转载 作者:行者123 更新时间:2023-12-05 06:45:02 25 4
gpt4 key购买 nike

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

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

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

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

稍后,我可以:

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

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

有没有更好的方法来保留文件名?现在我以任何 native 编码获取它,并且可以在不知情的情况下以相同的编码传递。至少我是这么认为的。

最佳答案

'и́'不是ASCII字符,也就是说它没有8位表示。它在 argv[1] 中的表示方式取决于操作系统。但它并没有只用一个 char 来表示。

fromLocal8bit 使用相同的 QTextCodec::codecForLocale作为 toLocal8bit。正如您所说,您的 std::string 将保存“Раи́са.txt”,所以这不是问题。

虽然 std::ifstream 可能期望每个 char 是它自己的 ,但取决于您的操作系统如何定义 std::ifstream char 而不是通过操作系统的翻译。我希望您使用的是 Windows,因为您看到了这个问题。在这种情况下,您应该使用 std::fstreamstd::wstring 实现,这是 Microsoft 特定的:http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx

您可以使用以下命令从 QString 获取 std::wstring:toStdWString

查看此处了解更多信息:fstream::open() Unicode or Non-Ascii characters don't work (with std::ios::out) on Windows

编辑:

对于可以访问它的项目来说,一个很好的跨平台选项是 Boost::Filesystem . ypnos提及 File-Streams特别相关。

关于qt - 在 std::string 和 QString 之间保留非 ascii 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26740785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com