在Qt 5.3中翻译Unicode字面量

4
在一个Qt 5.3应用程序中,我有一个包含非ASCII字符(具体来说是德语Umlauts)的字符串文字需要翻译成外语。因此我有两个问题:(1)我必须使用tr()标记该文字;(2)我必须正确显示该字符串在屏幕上,为此似乎需要使用QString::fromLatin1()或类似的函数。
如果我这样做:
QString s = tr("ä");

这段文字被标记为需要翻译,但不能正确显示。

如果我执行如下操作:

QString r = QString::fromLatin1("ä");

该字符串将正确显示但不会被标记为翻译。

我该如何将两者合并为一个?是的,我的源文件保存在UTF8编码中。

我已经在论坛上搜索了很久,但没有任何提示能够解决问题;主要是因为大多数解决方案适用于Qt 4.8,并且已经被移除或弃用于Qt 5.3。谢谢你的帮助!

PS:我正在使用Windows 8上的Visual Studio 2010进行开发。根据VS2010和Notepad ++,我的源代码以UTF8带BOM编码保存。


1
可能是因为trQString::fromUtf8等效(如果没有被#define定义)。翻译工具非常愚蠢,只会寻找tr("...");它会被#undef tr, #define tr(x) QString::fromLatin1(x)所欺骗。 - MSalters
2个回答

4
如果使用QString::fromLatin1("ä")可以得到正确的输出,那么你的源文件没有采用UTF-8编码。
当源文件...
printf("%x\n", QString("ä").at(0).unicode());
printf("%x\n", QString::fromLatin1("ä").at(0).unicode());

如果采用UTF-8编码,那么输出结果为:
e4
c3

但当使用Latin1 (ISO-8859-1)时,

fffd
e4

e4是字母ä(U+00E4)的Unicode代码。


谢谢您的回复。输出确实是您所描述的Latin1编码(fffd和e4),但我使用的每个文本编辑器都告诉我它被编码为UTF-8。现在我不知道该怎么办了...? - Patrick Bangert
尝试在文本编辑器(Qt Creator,NPP等)中打开源文件,选择正确的编码以正确显示字符串,并将此源文件的编码转换为带BOM的UTF-8。 - Dmitry Sokolov
我使用了几个文本编辑器(其中包括Qt Creator和NPP)将文件转换为UTF-8和Latin1,并运行您的代码。在这两种编码中,我得到了结果“fffd\ne4”。因此,您建议的测试似乎不起作用。 - Patrick Bangert
请在您的问题中注明您使用的系统、工具链等。 - Dmitry Sokolov
我在我的问题中补充说明了我正在Windows 8上使用VS2010。谢谢你的帮助! - Patrick Bangert

-1

阅读trUtf8在Qt5中已弃用/过时)的文档。
因此,您不必使用此函数,只需设置适当的默认编解码器。在主函数中添加以下行:

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

如果您希望避免更改默认编解码器,只需使用trUtf8而不是tr


好吧,这就是问题所在... trUtf8已经被弃用了,并且在Qt5.3中完全删除了编解码器的更改。因此,这两种方法都不起作用。 - Patrick Bangert
抱歉,我没有深入研究Qt4和Qt5在这方面的差异。 - Marek R

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