unicode字符无法转换为cp1252



我正在编写一个QT5应用程序(使用QT Creator),该应用程序使用黄道十二宫等特殊字符。此代码在Linux Mint 14:上运行良好

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

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

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

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

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

在您的Linux系统上,这两种方法都是"偶然"工作的,因为它对8位字符串使用UTF-8。

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

QString s = QString::fromUtf8("xE2x99x88");

以下是我的建议,让每一项工作都顺利进行:

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

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

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

  3. 我在源代码中使用这个代码片段作为C字符串:在main.cpp中添加#include <QTextCodec>,然后执行:

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

最新更新