【问题标题】:PyQt4: Non-ASCII character detected in trUtf8 stringPyQt4:在 trUtf8 字符串中检测到非 ASCII 字符
【发布时间】:2015-03-10 11:43:44
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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 用于所有内容 - 所以最终您甚至不需要显式设置编码。

    【讨论】:

    • 嗨。谢谢您的回答。我已经掌握了大部分拼图,但无法将它们组合在一起。
    • 您的回答符合 Qt 论坛中的this one。 .pro 文件中的CODECFORTR = UTF-8 和源文件中的简单tr('ελληνικά') 工作正常。作为记录,指定的编码(这种方式或使用trUtf8())用于新字符串,但在更新现有字符串时会被忽略(使用以前的编码)。在为现有项目指定默认编码时请记住这一点。从头开始创建一个新的 .ts 文件,然后重新翻译它,或者更好的是,将其与旧文件合并以保留已翻译的字符串。
    • 我不太清楚。让我详细说明一下,因为在进行一些测试时可能会产生误导。如果没有CODECFORTR = UTF-8,如果你创建一个像 tr('ελληνικά') 这样的字符串,你会得到 mojibake。如果您不修改字符串,则更改为 trUtf8('ελληνικά') 没有帮助。它没有更新,它的编码也没有。相反,如果它首先用 trUtf8('ελληνικά') 声明,则更改为 tr('ελληνικά') 不会带来任何问题,除非从头开始重新生成 .ts 文件。
    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2011-01-01
    • 2014-01-25
    • 1970-01-01
    • 2015-07-01
    • 2014-08-16
    相关资源
    最近更新 更多