Как я могу напечатать QString, содержащую специальный символ с Python, используя PyQt? - PullRequest
4 голосов
/ 07 января 2011


Мне не удалось просто напечатать переменную QString, содержащую специальный символ.
Я всегда получаю UnicodeEncodeError:

Кодек '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 или другой объект.

Ответы [ 2 ]

5 голосов
/ 07 января 2011

Это работает для меня, используя 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, если вы не используете специальную кодировку.Потоки печати принимают байтовые массивы / байтовые строки, а str () объекта Unicode эффективно пытается конвертировать Unicode в байтовый массив / байтовую строку.Вы не сможете избежать байтовых массивов!

1 голос
/ 08 января 2011

попробуйте следующее:

  1. добавьте # -*- coding: utf-8 -*- магический комментарий в начале вашего скрипта (подробности здесь )
  2. используйте строковое объявление "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

возвращает:

éé

éé

éé

надеюсь, это поможет, с уважением

...