2

我有英语和匈牙利语的简单应用程序。所有可本地化都在单独的模块 -localizable.py 中,例如:

#!/usr/bin/python
# -*- coding: utf-8 -*-
...
...
if language == "hun":
    LOGIN_LABEL_USERNAME_STR                    = 'Felhasználó'
    LOGIN_LABEL_PASSWORD_STR                    = 'Jelszó'
elif language == "eng":    
    LOGIN_LABEL_USERNAME_STR                    = 'Username'
    LOGIN_LABEL_PASSWORD_STR                    = 'Password'

但是当我在 loginDialog.py 中使用匈牙利语时:

import localizable
...
...
loginLayout.addRow(localizable.LOGIN_LABEL_USERNAME_STR, QtGui.QLineEdit())
loginLayout.addRow(localizable.LOGIN_LABEL_PASSWORD_STR, QtGui.QLineEdit())
...

我得到 Felhasználóand Jelszó而不是Felhasználóand Jelszó。任何帮助,将不胜感激。

4

2 回答 2

4

为什么不在模块中使用unicode对象localizable,而不是没有编码的字节串?

if language == "hun":
    LOGIN_LABEL_USERNAME_STR                    = u'Felhasználó'
    LOGIN_LABEL_PASSWORD_STR                    = u'Jelszó'

这对我有预期的效果。

您可能还需要考虑使用 Qt 提供的内置函数

于 2013-01-09T14:11:51.870 回答
2

发生这种情况是因为您的源文件是 UTF8 编码的,这意味着字符串在源代码文件中Felhasználó表示为字节。46 65 6c 68 61 73 7a 6e c3 a1 6c c3 b3如果您将这个字节数组打印出来,就好像它们是在 LATIN-1 编码中一样,您将得到Felhasználó.

此外,您将这些 UTF-8 编码字节作为纯字符串传递给 Qt,这似乎假设它采用 LATIN-1 编码。这意味着不是假设字节c3 b3( ó) 是óUTF8 中的代码,而是假设c3是普通的Ã并且b3³LATIN1 的情况。

frb 的答案是这样做的正确方法,因为通过发送一个unicode字符串,您已经完成了所有的解释,并且不会为 Qt 留下任何歧义。

于 2013-01-09T14:37:34.460 回答