0

我正在编写一个 QT5 应用程序(使用 QT Creator),它使用像星座这样的特殊字符。此代码在 Linux Mint 14 上运行良好:

QString s = QString::fromUtf8("\u2648");

但是当我在 Windows XP SP3 上编译它时,得到一个编译器警告,它说当前代码页是 cp1252 并且字符 \u2648 无法转换。当我运行程序时,这个字符显示为问号。

根据我的系统设置,我的 Windows 上安装了 UTF8(代码页 65001)。

4

2 回答 2

1

(注意,这个我没试过,也不知道你用的是哪个编译器,对QT完全不熟悉,所以可能会错。以下是基于Windows上Unicode的常识。)

在 Windows 上,通常假定 8 位字符串位于系统的当前代码页(也称为“ANSI”代码页)中。这绝不是UTF-8。在您的系统上,它显然是 cp1252。所以实际上有两件事出错了:

  1. 您正在指定一个 Unicode 字符,编译器会尝试将其转换为正确的代码页。在 Windows 上,这会导致编译时错误,因为 cp1252 没有代表 u+2648 的代码点。
  2. 但是假设代码可以编译,它仍然无法工作。您将这个字符串(它将在 cp1251 中)传递给 fromUtf8,它需要一个 UTF-8 字符串。由于字符串不是有效的 UTF-8,这可能会导致运行时错误。

在您的 Linux 系统上,两者都是“偶然”工作的,因为它使用 UTF-8 处理 8 位字符串。

要做到这一点,请立即在 UTF-8 中指定 8 位字符串:

QString s = QString::fromUtf8("\xE2\x99\x88");
于 2013-02-17T20:42:46.093 回答
-1

这是我的建议,以使一切正常:

  1. 只有一种编码类型 UTF-8!如果可能,请在任何地方使用它。因此,在 QtCreator 设置中为源 UTF-8 设置默认代码页。

  2. 您可以在 QtCreator 中转换您的源代码:编辑 -> 选择编码并在代码页中重新加载。如果无法完成,请以iconv这种方式使用 linux 控制台应用程序:

    iconv -f cp1252 -t utf-8 your_source_in_cp1251.cpp > your_source_in_utf8.cpp

  3. 我在源代码中将此代码片段用于 C 字符串:在main.cppadd#include <QTextCodec>中,然后执行:

// For correct encoding
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForCStrings(codec);
于 2013-02-17T19:18:19.423 回答