2010-02-21 6 views
3

Je reçois la chaîne suivante d'un site Web via mécaniser:problème UnicodeDecodeError avec mécaniser

'We\x92ve' 

Je sais que \ x92 est synonyme de » caractère. J'essaye de convertir cette chaîne en Unicode:

>> unicode('We\x92ve','utf-8') 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 2: unexpected code byte 

Qu'est-ce que je fais mal?

Edit: La raison pour laquelle j'ai essayé 'utf-8' était le suivant:

>> response = browser.response() 
>> response.info()['content-type'] 
'text/html; charset=utf-8' 

Maintenant, je vois que je ne peux pas toujours faire confiance tête de type de contenu.

+0

Eh bien ... vous * devriez *, en général, faire confiance à l'en-tête 'Content-Type'. Quand il y a un 'charset' déclaré, c'est le codage définitif de la page (même en remplaçant un jeu de caractères' '), et tous les navigateurs utiliseront cet encodage. Donc la page que vous allez chercher est simplement cassée; un seul octet '\ x92' apparaîtrait dans les navigateurs comme une marque' '. Il est préférable de ne pas deviner un «jeu de caractères» à moins que vous n'ayez vraiment pas d'autre choix; En règle générale, vous ne devriez revenir à un reniflement de type chardet que si aucun charset reconnu n'est déclaré. (Encore une fois, c'est ce que les navigateurs font.) – bobince

+0

@bobince J'ai vérifié cette page dans quelques navigateurs modernes et ils montrent tous le caractère. Je suis confus. – parxier

+0

URL? – bobince

Répondre

4

\x92 est synonyme de bien, mais il le fait dans le codage Windows 1252, et non en UTF-8:

>>> print unicode('We\x92ve','1252') 
We’ve 

Si vous ne savez pas quel est l'encodage de vos données source est, vous pouvez le détecter en utilisant chardet (extrêmement facile à utiliser).

+0

Merci, Max. J'ai approuvé l'en-tête de type de contenu qui était incorrect. Je vais définitivement regarder chardet. – parxier

Questions connexes