Qt Unicode 和 Umlauts

6

由于我们已将所有源文件和头文件转换为Unicode,我们在使用德语变音符时遇到了问题。源代码中一切正常,但QLabel和其他图形用户界面组件显示的变音符却是乱码。

ISO-8859-1格式的源文件可以正常工作,但在OSX和Windows之间切换时会出现问题。

在项目文件中需要设置什么吗?

环境:Qt 4.7 with Qt Creator 2.3.0,使用MinGW在Windows XP SP3上开发。

示例


看起来你的输出渲染不支持UTF-8编码。你应该进行一些配置以支持它。 - Kerrek SB
你的源文件可能是UTF-8编码的,当在Windows上打开时,它会认为它是ISO-8859编码的? - RedX
@RedX: Qt 应该将这一切都抽象化,所以我们真的不需要知道 Windows 在想什么。答案应该与 Qt 有关。 - Kerrek SB
@Kerrek 最终是编译器将该字符串转换为字节,选择“Ä”是Unicode'A+˝'还是Unicode'Ä'或ASCII'Ä',而他只能(在C++0x之前)从文件编码中了解到这一点。他可以做的是使用QString::fromUTF8或QString::fromASCII来确保QString在创建字符串时使用适当的编码。 - RedX
1
@RedX:你显然可以看到该字符串被编码为UTF-8,但以字节方式显示。 - Kerrek SB
2个回答

10

尝试调用

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

在创建完QApplication对象之后,如果您使用tr()函数,则需要使用QTextCodec::setCodecForTr函数。

编辑:这仅适用于Qt 5版本之前的Qt版本。更新的Qt版本期望源文件转换为UTF-8编码。


谢谢,这个很好用。请添加一句话:如果有人使用了 tr(),需要设置 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));,否则无法正常工作。然后我会很高兴地接受你的答案。 - atamanroman
1
为了让QByteArray::fromPercentEncoding()QByteArray::fromBase64()能够处理编码的非ASCII字符,我必须首先调用QTextCodec::setCodecForCStrings()QTextCodec::setCodecForLocale()。该系统的LANG环境变量设置为en_US.UTF-8 - maxschlepzig

0

我曾经遇到过类似的问题,于是决定在我的源文件中只使用7位ASCII字符,并安装一个QTranslator来创建umlauts。

由于应用程序需要被翻译成其他语言,因此这似乎是避免编码问题的好方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接