【问题标题】:Qt: Non ASCII characters in file names are replaced by '?'Qt:文件名中的非 ASCII 字符被替换为“?”
【发布时间】:2017-06-27 14:48:43
【问题描述】:

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

【问题讨论】:

  • 如果你的源文件是Latin1编码的,你可以试试QFile f(QString::fromLatin1(fileName)); Qt5默认是UTF-8
  • 尝试使用setlocale(LC_ALL, "") 设置正确的语言环境。
  • 如果问题不是代码,可能是您用于names in the file system 的字符编码。

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


【解决方案1】:

未设置系统区域设置。我没有意识到,因为有人在.bashrc 中添加了配置,所以语言环境是在终端中设置的。

为了解决这个问题,我创建了文件/etc/default/locale,内容如下:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    并检查您的0xC384 是否为Ä

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      相关资源
      最近更新 更多