【问题标题】:Visual Studio force UTF-8 with no signature file encodingVisual Studio 强制 UTF-8 没有签名文件编码
【发布时间】:2017-02-23 02:49:48
【问题描述】:

我正在使用 Qt5 和 Visual Studio 2012,最近编写了一个记录器类,它基本上将字符串流重定向到文件。前几天我意识到没有“特殊”字符支持(例如波兰语、德语、俄语)。

qDebug() << "Special characters: ąężźćłóĄĘŻĆŁÓ";

正在产生以下输出:

Special characters: �꿟����ʯƣ�

我尝试了多个 Unicode 设置在 File 中侦听 -> Advanced Save Options。

但是,如果没有BOM 签名,则无法保存文件,我认为这可能是问题所在,因为当我通过 Notepad++ 将文件编码更改为UTF-8 (without BOM),然后编译时,一切正常...不幸的是,直到我在 Visual Studio 中进行任何更改。

我也尝试将编译器编码设置为 Unicode:

Visual Studio 有什么解决方案可以在没有 BOM 签名的情况下将编码更改为 UTF-8?


写入文件的代码 sn-p:

file = new QFile;
file->setFileName(fileName);
file->open(QIODevice::Append | QIODevice::Text);

[..]

QTextStream out(file);
out.setCodec("UTF-8");
out << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss ") << value << "\n";

我也一直在尝试使用value.toUtf8()。

【问题讨论】:

  • 如果您在十六进制查看器中查看文件,除了 BOM 之外,从 VS-2012 和 Notepad++ 保存为 UTF-8 时,它看起来是否相同?
  • @RichardCritten No. 顺便说一句。 VS-2012 UTF-8 编码在 Notepad++ 中被检测为UCS-2 LE (Little Endian) BOM。
  • 这是控制台窗口输出吗?本机 windows 输出应该没问题。转换为 UTF-16 并使用 MessageBox 显示。顺便问一下,您使用的是哪个 Windows 版本? Vista,7,8,10...?
  • @BarmakShemirani 是的,它被打印在控制台输出中(仅在调试版本中),并且它被写入日志文件,尽管我并不真正关心控制台输出,因为正如我所说,我这里只靠文件输出。
  • 让我们暂时忘记控制台输出。显示写入文件的代码(可能以 UTF-8 写入),并显示读取 UTF-8 文件的代码。请注意,Windows 使用 UTF-16,因此如果没有正确转换,本机 Windows 程序将无法读取 Qt 程序。

标签: c++ visual-studio qt visual-studio-2012 encoding


【解决方案1】:

经过多次不成功的尝试,我有两种解决编码问题的方法:

  1. Visual Studio 插件:https://vlasovstudio.com/fix-file-encoding/,此插件可防止 Visual Studio 将 BOM 添加到文件的开头,这样我的所有文件都可以使用 UTF-8 编码,原始字符串可以包含特殊字符,它们将显示/写入没有任何问题,
  2. 这是@MrEricSir 在 cmets 中建议的。这个想法是在包含特殊字符的字符串上使用QStringLiteral 函数。

    像这样:QStringLiteral("ąśżęłóĄŚŻĘŁÓ");

我个人选择了第一种方法,因为它不会强迫我每次想要打印特殊字符时都继续使用附加功能。在这两种情况下,结果都是一样的。

感谢所有发表评论并试图提供帮助的人。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 2011-08-19
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2018-05-21
    • 2012-01-23
    相关资源
    最近更新 更多