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
的文件解析没有影响,它只能在执行时有所不同。
tr
和trUtf8
的区别在于,后者明确声明编码为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-8
。 trUtf8
函数在 Qt4 中实际上已经过时了。它甚至不存在于 Qt5 中,它假定所有内容都是 UTF-8
- 所以最终你甚至不需要显式设置编码。
我正在尝试弄清楚如何为 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
的文件解析没有影响,它只能在执行时有所不同。
tr
和trUtf8
的区别在于,后者明确声明编码为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-8
。 trUtf8
函数在 Qt4 中实际上已经过时了。它甚至不存在于 Qt5 中,它假定所有内容都是 UTF-8
- 所以最终你甚至不需要显式设置编码。