Как я могу распечатать QString, содержащую специальный символ с Python с помощью PYQT?
Вопрос
Мне не удалось просто распечатать переменную QString, содержащую специальный символ.
Я всегда получаю UnicodeeCodeError:
Кодек ASCII 'не может кодировать символы в положении ....
Вот код, который я пробовал без успеха:
var1 = "éé" #idem with u"éé"
var2 = QString (var1)
print var2
--->>> UnicodeEncodeError
print str(var2)
--->>> UnicodeEncoreError
var3 = QString.fromLocal8Bit (var1) #idem with fromLatin1 and fromUtf8
print var3
--->>> UnicodeEncodeError
codec = QTextCodec.codecForName ("UTF-8") #idem with ISO 8859-1
var4 = codec.toUnicode (var2.toUtf8().data()) #idem with toLatin1 instead of toUtf8
print var4
--->>> UnicodeEncodeError
Я также пытался использовать:
QTextCodec.setCodecForCStrings(QTextCodec.codecForName("UTF-8"))
Мне действительно нужно распечатать переменную QString, а не QbyTearray или другой объект.
Решение
Это работает для меня, используя toUtf8()
:
>>> s = u'éé'
>>> qs = QString(s)
>>> qs
PyQt4.QtCore.QString(u'\xe9\xe9')
>>> print qs
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
>>> print qs.toUtf8()
éé
>>>
Ваши внутренние данные должны быть Unicode, поэтому вы должны использовать u'éé'
а не просто 'éé'
Как вы говорили в вашем вопросе. Ваш комментарий даже говорит u'éé'
.
Обновлять: Извините, но печатаю или str()
На Unicode не может быть гарантировано на объектах Unicode, если вы не используете определенную кодировку. Печатные потоки принимают байтовые массивы / BYTESTRIONS, а STR () на объекте Unicode эффективно пытается преобразовать Unicode в байтовый массив / ByteString. Вы не сможете избежать байтовых массивов!
Другие советы
Попробуйте следуйте:
- Добавить
# -*- coding: utf-8 -*-
Волшебный комментарий на прошу вашего сценария (детали здесь) - Используйте объявление строки «U» с константой строки
Ниже приведен пример, который работает для меня
# -*- coding: utf-8 -*-
from PyQt4 import QtCore
var1 = u"éé" #idem with u"éé"
print var1
var2 = QtCore.QString(var1)
print var2
var3 = QtCore.QString(u"éé")
print var3
Возвращает:
éé
éé
éé
Надеюсь, это поможет, по отношению