56 votes

Python UnicodeDecodeError - Est-ce que je comprends mal le code?

Des idées sur pourquoi cela ne fonctionne pas? Je pensais vraiment qu'ignorer ferait la bonne chose.

 >>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)
 

214voto

tzot Points 32224

...il y a une raison pour laquelle ils sont appelés "encodages"...

Un petit préambule: pensez à unicode comme la norme, ou de l'état idéal. Unicode est juste un tableau de caractères. №65 latin capital A. №937 est capitale grecque oméga. Juste que.

Pour qu'un ordinateur pour stocker et-ou de manipuler Unicode, il a pour encoder en octets. Le plus simple est le codage de l'Unicode UCS-4; chaque caractère occupe 4 octets, et tous les ~1000000 caractères sont disponibles. Le 4 octets contiennent le nombre de caractère dans les tableaux Unicode comme un entier de 4 octets. Un autre très utile encodage est UTF-8, qui peut encoder n'importe quel caractère Unicode avec un à quatre octets. Mais il y a aussi quelques rares encodages, comme "latin1", qui comprennent une gamme limitée de caractères, utilisé surtout par les pays Occidentaux. Ces codages utilisez uniquement un octet par caractère.

Fondamentalement, Unicode peut être codé avec de nombreux encodages, et encodées peuvent être décodés en Unicode. Le truc, c'est de l'Unicode est venu assez tard, donc chacun d'entre nous qui ont grandi avec un 8-bit jeu de caractères appris trop tard que tout ce temps, nous avons travaillé avec codé cordes. L'encodage peut être ISO8859-1 ou windows CP437, ou CP850, ou, ou, ou, selon notre système par défaut.

Ainsi, lorsque, dans votre code source, vous saisissez la chaîne de caractères "ajouter "Suivi" pour la liste" (et je pense que vous vouliez la chaîne "ajouter "Suivi" pour la liste", note la deuxième citation), vous êtes réellement en utilisant une chaîne de caractères déjà codé en fonction de votre système de page de codes par défaut (par l'octet \x93 je suppose que vous utilisez Windows page de codes 1252, "l'Ouest"). Si vous souhaitez obtenir Unicode, vous devez décoder la chaîne à partir de la "cp1252" encoding.

Donc, ce que vous vouliez faire, c'est:

"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")

Il est malheureux que Python 2.x inclut un .encode méthode pour les chaînes de trop; c'est une fonction de commodité pour le "spécial" encodages, comme le "zip" ou "rot13" ou "base64", qui n'ont rien à voir avec Unicode.

De toute façon, tout ce que vous avez à retenir pour vos va-et-vient conversions Unicode est:

  • une chaîne Unicode obtient codé à un Python 2.x chaîne (en fait, une séquence d'octets)
  • un Python 2.x chaîne est décodé à une chaîne Unicode

Dans les deux cas, vous devez spécifier l' encodage qui sera utilisé.

Je ne suis pas très clair, je suis endormi, mais j'espère bien que je l'aide.

PS UN côté humoristique remarque: les Mayas n'ont pas Unicode; les Romains de l'antiquité, les Grecs de l'antiquité, les Égyptiens de l'antiquité n'a pas trop. Ils avaient tous leur propre "encodages", et avaient peu ou pas de respect pour les autres cultures. Toutes ces civilisations s'est effondrée à la poussière. Penser les gens! Votre application Unicode, pour le bien de l'humanité. :)

PS2 s'il vous Plaît ne pas gâcher le précédent message en disant: "Mais les Chinois...". Si vous vous sentez enclin ou l'obligation de le faire, cependant, le retard en pensant que l'Unicode BMP est peuplée principalement par des idéogrammes chinois, ergo Chinois est à la base de l'Unicode. Je peux aller sur d'inventer scandaleux mensonge, tant que les gens développent Unicode applications. Cheers!

4voto

Roberto Liffredo Points 15265

l'encodage est disponible pour les chaînes unicode, mais la chaîne que vous possédez ne semble pas unicode (essayez avec u'add \ x93Monitoring \ x93 to list ')

 >>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '
 

0voto

Gregg Lind Points 6905

J'ai aussi écrit un long blog sur ce sujet:

La difficulté d'Unicode et de passer à autre chose

-3voto

Greg Points 7098

Cela semble fonctionner:

 'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-1')
 

Des problèmes avec ça? Je me demande quand "ignorer", "remplacer" et autres, tels que la gestion des erreurs de codage entre?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X