Comment puis-je imprimer un QString contenant un caractère spécial avec Python en utilisant PyQt?
Question
Je ne suis pas réussi à imprimer simplement une variable QString contenant un caractère spécial.
Je reçois toujours un UnicodeEncodeError:
'ascii' codec ne peut pas Encode les caractères dans la position ....
Voici le code que j'essayé sans succès:
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
J'ai aussi essayé d'utiliser:
QTextCodec.setCodecForCStrings(QTextCodec.codecForName("UTF-8"))
J'ai vraiment besoin d'imprimer une variable QString, pas un QByteArray ou un autre objet.
La solution
Il fonctionne pour moi en utilisant 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()
éé
>>>
Vos données internes doivent être Unicode, vous devez utiliser u'éé'
plutôt que 'éé'
comme vous l'avez dit dans votre dans votre question. Votre commentaire dit même u'éé'
.
Mise à jour: Désolé, mais l'impression ou str()
sur Unicode ne peut pas être garantie à travailler sur des objets Unicode sauf si vous utilisez un codage spécifique. les flux d'impression acceptent des tableaux d'octets / str et les chaînes d'octets () sur un objet Unicode tente de convertir efficacement Unicode à un tableau d'octets / bytestring. Tu ne vas pas être en mesure d'éviter des tableaux d'octets!
Autres conseils
essayez ce qui suit:
- ajouter un commentaire magique
# -*- coding: utf-8 -*-
à la mendicité de votre script (détails ) - utilisation "u" déclaration de chaîne avec votre constante de chaîne
ci-dessous est un exemple qui fonctionne pour moi
# -*- 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
retours:
éé
éé
éé
espérons que cette aide, ce qui a trait