2017-08-06 1 views
0

J'utilise le sélénium pour insérer du texte avec des trémas allemands dans un formulaire Web. Le codage déclaré pour le script python est utf-8. La page utilise l'encodage utf-8. Quand je definine une chaîne comme que tout fonctionne bien:Encodage Python unicode utf-8

q = u"Hällö" #type(q) returns unicode 
... 
textbox.send_keys(q) 

Mais quand j'essaie de lire à partir d'un fichier de configuration en utilisant ConfigParser (ou un autre type de fichier) je reçois sortie malformé dans le webformular (Hällö). C'est le code que j'utilise pour cela:

the_encoding = chardet.detect(q)['encoding'] #prints utf-8 
q = parser.get('info', 'query') # type(q) returns str 
q = q.decode('unicode-escape') # type(q) returns unicode 
textbox.send_keys(q) 

Quelle est la différence entre les deux q donnés à la fonction send_keys?

+0

Essayez 'q.decode ('latin-1')' à la place. –

+0

Obtenir la même sortie malformée – Robin

+0

Ceci est un exemple classique de mojibake. Si vous faites ceci dans un terminal UTF-8 (en Python 2 ou 3): 'print (u" Hällö ".encode ('utf8'). Decode ('latin1'))', vous obtiendrez 'Hällà ¶'. Inversement, 'print (u'Hällö.encode ('latin1'). Decode ('utf8'))' imprime 'Hällö'. –

Répondre

0

Ceci est probablement un mauvais encodage. Essayez d'imprimer q avant la dernière instruction, et voyez si c'est égal. Cette ligne q = parser.get('info', 'query') # type(q) returns str doit renvoyer la chaîne 'H\xc3\xa4ll\xc3\xb6'. Si c'est différent, alors vous utilisez un mauvais codage.

>>> q = u"Hällö" # unicode obj 
>>> q 
u'H\xe4ll\xf6' 
>>> print q 
Hällö 
>>> q.encode('utf-8') 
'H\xc3\xa4ll\xc3\xb6' 
>>> a = q.encode('utf-8') # str obj 
>>> a 
'H\xc3\xa4ll\xc3\xb6' # <-- this should be the value of the str 
>>> a.decode('utf-8') # <-- unicode obj 
u'H\xe4ll\xf6' 
>>> print a.decode('utf-8') 
Hällö 
>>> 
0
from ConfigParser import SafeConfigParser 
import codecs 

parser = SafeConfigParser() 

with codecs.open('cfg.ini', 'r', encoding='utf-8-sig') as f: 
    parser.readfp(f) 
greet = parser.get('main', 'greet') 

print 'greet:', greet.encode('utf-8-sig') 

greet: Hallo

fichier cfg.ini

[main] 
greet=Hällö