Question

Toute réflexion sur pourquoi cela ne fonctionne pas? Je pensais vraiment « ignorer » serait faire 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)
Était-ce utile?

La solution

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

Un petit préambule: penser unicode comme la norme, ou l'état idéal. Unicode est juste une table de caractères. №65 est capitale latine A. №937 est omega capitale grecque. Cela.

Pour un ordinateur pour stocker et manipuler ou Unicode, il faut encode dans octets. Le plus simple encodage de l'Unicode est UCS-4; chaque caractère occupe 4 octets, et tous les caractères ~ 1000000 sont disponibles. Les 4 octets contiennent le numéro du caractère dans les tableaux Unicode comme un nombre entier de 4 octets. Un autre encodage très utile est UTF-8, qui peut encoder tous les caractères Unicode avec un à quatre octets. Mais il y a aussi quelques encodages limités, comme « latin1 », qui comprennent une gamme très limitée de caractères, la plupart du temps utilisé par les pays occidentaux. Ces encodages utiliser un seul octet par caractère.

En principe, Unicode peut être codé avec de nombreux codages et les chaînes codées peuvent être décodée Unicode. La chose est, Unicode est venu assez tard, donc nous tous qui a grandi en utilisant un 8 bits jeu de caractères a appris trop tard que tout ce temps nous avons travaillé avec codées chaînes. Le codage peut être ISO8859-1, ou les fenêtres CP437, CP850 ou, ou, ou, ou, selon notre système par défaut.

Alors, quand, dans votre code source, vous entrez dans la chaîne « ajouter « Surveillance » à la liste » (et je pense que vous vouliez la chaîne « ajouter « surveillance » à la liste », notez la deuxième citation), vous êtes en fait à l'aide une chaîne déjà encodée selon votre page de code par défaut du système (par l'octet \ x93 Je suppose que vous utilisez Windows 1252 codepage, « Western »). Si vous souhaitez obtenir Unicode de cela, vous devez decode la chaîne à partir du codage "CP1252".

Alors, que vous vouliez faire, était:

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

Il est regrettable que Python 2.x comprend une méthode pour les chaînes trop .encode; c'est une fonction pratique pour les encodages « spéciaux », comme le « zip » ou « rot13 » ou ceux « base64 », qui n'a rien à voir avec Unicode.

Quoi qu'il en soit, tout ce que vous avez à retenir pour vos-et-fro conversions Unicode est la suivante:

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

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

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

PS Une note de côté humoristique: Mayans n'avait pas Unicode; Romains, les Grecs anciens, anciens Égyptiens pas trop. Ils avaient tous leurs propres « encodages », et avait peu à aucun respect pour les autres cultures. Toutes ces civilisations émietté à la poussière. Pensez-y les gens! Faites vos applications Unicode-aware, pour le bien de l'humanité. :)

PS2 S'il vous plaît ne pas gâcher le message précédent en disant: « Mais les Chinois ... ». Si vous avez envie ou obligé de le faire, cependant, le retarder en pensant que l'Unicode BMP est peuplé principalement par des idéogrammes chinois, ergo chinois est la base d'Unicode. Je peux continuer à inventer des mensonges scandaleux, aussi longtemps que les gens développent des applications au courant Unicode. Vive!

Autres conseils

encode est disponible pour les chaînes unicode, mais la chaîne que vous avez là ne semble pas unicode (essayez avec u'add \ x93Monitoring \ x93 à la liste « )

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

Cela semble fonctionner:

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

Tout problème avec ça? Je me demande quand « ignorer », « remplacer » et d'autres le traitement des erreurs de codage vient?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top