PyQt4:在trUtf8字符串中检测到非ASCII字符

时间:2015-03-10 11:43:44

标签: python python-2.7 utf-8 qt4 pyqt4

我正在尝试弄清楚如何提供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的文件解析没有影响,只能在执行时产生差异。

1 个答案:

答案 0 :(得分:1)

trtrUtf8之间的区别在于后者明确声明编码为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为所有内容 - 所以最终你甚至不需要显式设置编码。