Qt:文件名中的非ASCII字符被替换为“?”

3

我需要在一个非常简化的系统上工作。它基于Ubuntu,但没有使用Ubuntu安装程序安装。因此只有真正必要的软件包和配置。QtCreator已安装并可用。

当我尝试创建一个带有非ASCII字符的文件时,该字符被替换为?。例如:TestÄ.txt将被命名为Test?.txt。但只有在使用Qt函数时才会发生这种情况。C++标准库可以正常工作。

示例:

#include <QDebug>
#include <QFile>
#include <fstream>

int main(int, char *[])
{
    const char* fileName = "TestÄ.txt";
    qDebug() << fileName;

    {
        QFile f(fileName);
        f.open(QIODevice::WriteOnly);
        f.write("QFile Äößń\n");
    }

    {
        std::ofstream f;
        f.open(fileName, std::fstream::app);
        f << "std::ofstream Äößń\n";
    }

    return 0;
}

应该有一个名为TestÄ.txt的文件,其中有两行内容。但是第一个代码块却创建了一个名为Test?.txt的文件。第二个代码块按预期工作。文件的内容被正确写入。


1
如果您的源文件是Latin1编码,您可以尝试使用QFile f(QString::fromLatin1(fileName));。Qt5默认假定为UTF-8编码。 - m7913d
尝试使用 setlocale(LC_ALL, "") 设置正确的区域设置。 - n. m.
1
如果问题不是代码本身,那么可能是你在文件系统中使用的字符编码有问题。请参考此链接 - Tom Blodget
2个回答

2
系统语言环境未设置。由于某人在.bashrc中添加了配置,因此终端中已设置语言环境,我没有意识到这一点。
为了修复它,我创建了文件/etc/default/locale,并填写了以下内容:
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"

0

这可能是因为您的编译器不知道如何处理源文件中的Ä

您可以尝试使用"Test\xC3\x84.txt"(如果您使用的是C++17,则可以使用u8"TestÄ.txt")。

此外,请注意QFile构造函数将会把您的字符数组转换为QString。如果您想要检查这个过程,您可以添加:

qDebug() << QString(fileName).toUtf8().toHex(); // Should print "54657374c3842e747874"

并检查您是否在Ä处有0xC384


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接