可能重复:
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
答案 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编码或其他东西。