4

每当我尝试将 astd::string转换为QString带有这个字母的 a (' ß ')时,它QString都会变成类似“ Ã ”或其他一些非常奇怪的字母。怎么了?我使用了这段代码,它没有引起任何错误或警告!

std::string content = "Heißes Teil.";
ui->txtFind_lang->setText(QString::fromStdString(content));

这个std::string角色没有问题。我什至把它写成一个文本文件没有问题。那么我做错了什么?

4

2 回答 2

6

您需要将编解码器设置为 UTF-8 :

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

默认情况下,Qt 使用有限的 Latin-1 编码。通过添加此代码,您将默认编码设置为 UTF-8,这允许您使用更多字符。

于 2013-03-22T20:33:38.353 回答
1

虽然antoyo答案有效,但我不太清楚为什么。所以,我决定调查一下。

我的所有文档都以UTF-8编码,大多数网页也是如此。该ß字符的 UTF 代码点为UTF+00DF

由于 UTF-8 是一种可变长度编码,因此在二进制形式中,ß将被编码为11000011 10011111or C3 9F。因为默认情况下 Qt 依赖于Latin1编码。它会读ß作两个不同的字符。第一个C3将映射到Ã,第二个9F不会映射到任何内容,因为 Latin1 无法识别 128-159(十进制)之间的字节。

这就是为什么在使用 Latin1 编码时ß出现的原因。Ã


旁注:您可能想复习一下 UTF-8 编码的工作原理,因为否则ß即使它的代码点DF小于FF并且应该只消耗一个字节,它也需要两个字节似乎有点不直观。

于 2013-03-23T15:12:44.313 回答