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

时间:2017-06-27 14:48:43

标签: c++ linux qt ubuntu character-encoding

我必须在一个非常简化的系统上工作。它基于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。第二个块按预期工作。文件内容写得正确。

2 个答案:

答案 0 :(得分:2)

未设置系统区域设置。我没有意识到这一点,因为有人在.bashrc中添加了配置,因此在终端中设置了区域设置。

要解决此问题,我创建了文件/etc/default/locale,内容为:

LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"

答案 1 :(得分:0)

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

你可以试试"Test\xC3\x84.txt"(如果你有C ++ 17,可以u8"TestÄ.txt"。)

另请注意,QFile构造函数会将char数组转换为QString。如果你想检查一下这是怎么回事,你可以添加:

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

并检查0xC384是否有Ä