我正在编写一个 QT5 应用程序(使用 QT Creator),它使用像星座这样的特殊字符。此代码在 Linux Mint 14 上运行良好:
QString s = QString::fromUtf8("\u2648");
但是当我在 Windows XP SP3 上编译它时,得到一个编译器警告,它说当前代码页是 cp1252 并且字符 \u2648 无法转换。当我运行程序时,这个字符显示为问号。
根据我的系统设置,我的 Windows 上安装了 UTF8(代码页 65001)。
(注意,这个我没试过,也不知道你用的是哪个编译器,对QT完全不熟悉,所以可能会错。以下是基于Windows上Unicode的常识。)
在 Windows 上,通常假定 8 位字符串位于系统的当前代码页(也称为“ANSI”代码页)中。这绝不是UTF-8。在您的系统上,它显然是 cp1252。所以实际上有两件事出错了:
在您的 Linux 系统上,两者都是“偶然”工作的,因为它使用 UTF-8 处理 8 位字符串。
要做到这一点,请立即在 UTF-8 中指定 8 位字符串:
QString s = QString::fromUtf8("\xE2\x99\x88");
这是我的建议,以使一切正常:
只有一种编码类型 UTF-8!如果可能,请在任何地方使用它。因此,在 QtCreator 设置中为源 UTF-8 设置默认代码页。
您可以在 QtCreator 中转换您的源代码:编辑 -> 选择编码并在代码页中重新加载。如果无法完成,请以iconv
这种方式使用 linux 控制台应用程序:
iconv -f cp1252 -t utf-8 your_source_in_cp1251.cpp > your_source_in_utf8.cpp
我在源代码中将此代码片段用于 C 字符串:在main.cpp
add#include <QTextCodec>
中,然后执行:
// For correct encoding
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForCStrings(codec);