PyQt希腊字母编码

时间:2016-01-10 21:22:50

标签: python qt unicode pyqt

我有一个python程序,我正在使用pyqt。我使用QFileDialog选择目录,然后使用该目录运行脚本。问题是,如果目录名是希腊语,程序将以异常停止

ascii codec can't encode characters in position 

如果目录的名称是英文,一切正常。 我该如何解决?

try:
            directory = QtGui.QFileDialog.getExistingDirectory(MainWindow,"Please select directory ") #Select the directory for check   

            if directory != "":
                directory = str(directory)

                self.updatedirectory(directory)
        except Exception as e:    
            self.AlertMessage(e)

3 个答案:

答案 0 :(得分:3)

考虑告诉PyQt使用本机Python unicode字符串

在导入PyQt之前,请插入:

import sip
sip.setapi('QString', 2)

QtCore.QString将不再存在(如果您尝试手动创建QString,则会遇到异常),之前返回QString的所有PyQt方法都将返回Python unicode字符串。

注意:不要尝试使用str()对unicode字符串进行类型转换。只需直接使用getExistingDirectory的结果。

答案 1 :(得分:2)

请勿使用str()转换QString:始终使用unicode()

    directory = unicode(directory)

在Python 2中,str()转换为 bytes 。如果在包含unicode的字符串对象上使用它,它将尝试使用默认编解码器编码,即“ascii”。因此,如果字符串包含非ascii字符,您显然会收到错误:

>>> from PyQt4 import QtCore
>>> s = QtCore.QString(u'Γειά σου Κόσμε!')
>>> x = str(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
ordinal not in range(128)

但如果使用unicode(),它会直接将QString转换为python unicode对象(即无需进行任何编码/解码):

>>> x = unicode(s)
>>> type(x)
<type 'unicode'>
>>> print x
Γειά σου Κόσμε!

答案 2 :(得分:1)

QtGui.QFileDialog返回QString,如果要从中提取string,请使用其中一种方法,例如QString.toLatin1

示例:

>>> from PyQt4.QtCore import QString
>>>
>>> s = QString(u'Γεια σου')
>>> 
>>> s
PyQt4.QtCore.QString(u'\xce\x93\xce\xb5\xce\xb9\xce\xb1 \xcf\x83\xce\xbf\xcf\x85')
>>> print s

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    print s
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
>>>
>>>print str(s.toLatin())
Γεια σου

您可能需要尝试其他方法来获得所需的输出。

因此,在您的情况下,这可能适合您:

directory = str(directory.toLatin())