如何在QString / QDebug中使用Unicode字符?

时间:2012-10-10 15:35:24

标签: c++ qt unicode utf-8 qt-creator

  

可能重复:
  I lose “unicodeness” when qDebug()ing after instancing a QApplication

我正在尝试在我的项目中使用Unicode字符,但Unicode字符正在转换为某些值(例如:?)。

#include <QtCore/QCoreApplication>
#include <QTextCodec>
#include <QDebug>
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);
  QTextCodec *codec = QTextCodec::codecForName("UTF-8");
  QTextCodec::setCodecForCStrings(codec);
  //Unicode character here is '
  QString unicode = "Hello I’ve to go";
  qDebug() << "Unicode String: " << unicode;
  return a.exec();
}

上面的代码将字符串值打印为 Hello I?ve to go

3 个答案:

答案 0 :(得分:2)

C ++ 11增加了对unicode字符的支持。尝试正确转义该unicode字符:

u8"Hello I\u2019ve to go"

This works for me。虽然完全有可能你没有字体中的U + 2019代码点,所以它将它绘制为?代替正确的字符。

答案 1 :(得分:0)

编译器将字符串文字从源编码转换为执行编码。您明确使用的执行编码无法处理该字符,因此将其替换为&#39;?&#39;。

如果您的编译器支持(gcc使用标记-fexec-charset)或不支持它的技巧编译器(例如Visual Studio)不执行此操作,您需要选择不同的执行编码通过说明源编码是什么来进行转换。

通过将源代码设置为UTF-8而无需签名,您可以向VS说谎源编码。 VS将假设源编码是非Unicode程序的系统&#34;编码&#34;它与执行编码使用的相同。因为它会认为编码是相同的,所以它不会执行任何转换,字符串文字将是UTF-8。您必须小心避免源代码中的任何其他内容,但编译器需要知道正确的编码。例如,如果您这样做,那么宽字符串文字将无法正确转换。

另一个解决方案是新的C ++ 11 UTF-8字符串文字:u8"Hello I’ve to go"。这些由编译器从源编码转换为UTF-8,而不是执行编码。不幸的是Visual Studio还不支持UTF-8字符串文字。


在上面的评论中,你说&#34;在我的真实项目中,这个值是从文件名中读取的。&#34;这表明问题与您提出的问题完全不同。解决这个问题需要详细了解您如何获得文件名。

向您展示如何修复您发布的代码无法解决您的实际问题,因为您发布的代码中的问题和您的实际问题不同。没有通用的解决方案&#39;这解决了两个问题。

答案 2 :(得分:0)

test.txt (utf-8)

  

您好我要去。

     

这是另一项测试。

<强>的main.cpp

#include <QtCore>

int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);
  QString unicode = QString::fromUtf16(L"Hello I\u2019ve to go");
  qDebug() << "Unicode String: " << unicode;

  QFile in_file("test.txt");

  if (!in_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    return -1;
  }

  QTextStream in(&in_file);
  while(!in.atEnd()) {
    QString line = in.readLine();
    qDebug() << line;
  }
}

<强>输出:

Unicode String:  "Hello I’ve to go" 
"Hello I’ve to go." 
"Here is another test." 

它的工作原理是硬编码值和运行时读取的值。我怀疑你正在阅读文件时出现了一些问题,即你使用了错误的编码或转换为Latin-1编码或其他东西。