我正在尝试弄清楚如何提供PyQt tr()
或trUtf8()
函数UTF-8文本。
以下是示例字符串:
self.tr('λληνικά')
self.tr(u'εληνικά')
self.tr('ελνικά'.encode('utf-8'))
self.tr(u'ελληικά'.encode('utf-8'))
self.trUtf8('λληνικ')
self.trUtf8(u'εληνιά')
self.trUtf8('ελνι'.encode('utf-8'))
self.trUtf8(u'ελλκά'.encode('utf-8'))
self.tr
的人在Qt Linguist中显示为乱码。 self.trUtf8
显示正常,但在应用pylupdate4
时会触发警告:
Non-ASCII character detected in trUtf8 string
领先的u和.encode('utf-8')
似乎没有任何区别,至少在解析时(使用pylupdate4
)。
正确的方法是什么?
我也想知道这条线的作用:
QtCore.QTextCodec.setCodecForTr(QtCore.QTextCodec.codecForName("utf-8"))
但我知道它对pylupdate4
的文件解析没有影响,只能在执行时产生差异。
答案 0 :(得分:1)
tr
和trUtf8
之间的区别在于后者明确声明编码为UTF-8
。
就其自身而言,tr
并不暗示字符串的编码,因此您必须只传递ascii字符串,或使用setCodecForTr
显式设置适当的编码。但正如你猜测的那样,这只会在运行时产生影响。为了使pylupdate
也使用该编码,您需要在专业文件中设置相应的变量:
CODECFORTR = UTF-8
SOURCES = source.py
TRANSLATIONS = translation.ts
(似乎pylupdate
将假定latin-1
编码而没有该编码,因此该编码中不可用的任何字符都将以mojibake结尾。)
至于警告信息:它们可能反映了Qt docs for trUtf8关于可移植性问题的相应警告。
最佳方法是使用tr
并明确将编码设置为UTF-8
。 Qt4中trUtf8
函数实际上已过时。它甚至不存在于Qt5中,它假设UTF-8
为所有内容 - 所以最终你甚至不需要显式设置编码。