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

PyQt4: Non-ASCII character detected in trUtf8 string

我正在尝试弄清楚如何为 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的文件解析没有影响,它只能在执行时有所不同。

trtrUtf8的区别在于,后者明确声明编码为UTF-8

就其本身而言,tr 对字符串的编码没有任何暗示,因此您只能将其传递为 ascii 字符串,或者使用 setCodecForTr 显式设置适当的编码。但正如您推测的那样,这只会在运行时产生影响。为了pylupdate也使用那个编码,你需要在pro文件中设置一个相应的变量:

CODECFORTR = UTF-8
SOURCES = source.py
TRANSLATIONS = translation.ts

(似乎 pylupdate 将采用 latin-1 编码而不使用该编码,因此该编码中不可用的任何字符最终都会成为 mojibake。

至于警告消息:它们可能是为了反映 Qt docs for trUtf8 中关于可移植性问题的相应警告。

继续的最佳方法是使用 tr 并将编码显式设置为 UTF-8trUtf8 函数在 Qt4 中实际上已经过时了。它甚至不存在于 Qt5 中,它假定所有内容都是 UTF-8 - 所以最终你甚至不需要显式设置编码。