0

可能重复:
在实例化 QApplication 后 qDebug() 时,我失去了“unicodeness”

我正在尝试在我的项目中使用 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

4

3 回答 3

2

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

u8"Hello I\u2019ve to go"

这对我有用。尽管您的字体中完全有可能没有 U+2019 代码点,但它会将其绘制为?正确字符的位置。

于 2012-10-10T15:55:56.187 回答
0

test.txt (utf-8)

你好我得走了。

这是另一个测试。

主文件

#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 编码或其他东西。

于 2012-10-10T16:10:33.853 回答
0

编译器将字符串文字从源编码转换为执行编码。您使用的执行编码显然无法处理该字符,因此将其替换为“?”。

如果您的编译器支持该执行编码(gcc 使用 flag ),您需要选择不同的执行编码,-fexec-charset或者欺骗不支持该执行编码的编译器(例如 Visual Studio)不执行此转换,方法是对源编码撒谎是。

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

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


在上面的评论中你说“在我的真实项目中,这个值是从文件名中读取的。” 这表明与您的问题中所展示的问题完全不同。解决这个问题将需要有关您如何准确获取文件名的详细信息。

向您展示如何修复您发布的代码不会解决您的实际问题,因为您发布的代码中的问题和您的实际问题是不同的。不会有解决这两个问题的“通用解决方案”。

于 2012-10-10T15:59:06.807 回答