unicode字符无法转换为cp1252

时间:2013-02-17 19:04:06

标签: qt unicode utf-8

我正在编写一个QT5应用程序(使用QT Creator),它使用十二生肖等特殊字符。这段代码在Linux Mint 14上运行得非常好:

QString s = QString :: fromUtf8(“\ u2648”);

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

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

2 个答案:

答案 0 :(得分:1)

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

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

  1. 您正在指定Unicode字符,编译器会尝试将其转换为正确的代码页。在Windows上,这会导致编译时错误,因为cp1252没有代码点来表示u + 2648。
  2. 但假设代码会编译,它仍然无法正常工作。你将这个字符串传递给ct1251到fromUtf8,它需要一个UTF-8字符串。由于字符串无效UTF-8,这可能会导致运行时错误。
  3. 在Linux系统上,两者都“偶然”工作,因为它使用UTF-8作为8位字符串。

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

    QString s = QString::fromUtf8("\xE2\x99\x88");
    

答案 1 :(得分:-1)

我的建议是让工作顺利进行:

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

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

      

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

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

  4. // For correct encoding
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForCStrings(codec);