我有一个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)
答案 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())