Encodage donne “'ascii' codec ne peut pas encoder les caractères ... ordinale pas in range(128)”
Je suis en train de travailler à travers le Django lecteur de flux RSS de projet ici.
Le flux RSS va lire quelque chose comme "OKLAHOMA CITY (AP) — James Harden laisser". Le flux RSS de l'encodage de lit encoding="UTF-8" je pense donc je suis de passage en utf-8 à démarque dans l'extrait de code ci-dessous. Le tiret cadratin est où elle s'étouffe.
- Je obtenir le Django d'erreur de "'ascii' codec ne peut pas encoder les caractères u'\u2014' à la position 109: ordinal pas in range(128)" qui est un UnicodeEncodeError. Dans les variables étant passé, je vois "OKLAHOMA CITY (AP) \u2014 James Harden". La ligne de code qui ne fonctionne pas est:
content = content.encode(parsed_feed.encoding, "xmlcharrefreplace")
Je suis en utilisant markdown 2.0, django 1.1, et python 2.4.
Qu'est-ce que la magie de la séquence de codage et de décodage que je dois faire pour faire ce travail?
(En réponse à Prometheus demande. Je suis d'accord la mise en forme permet d')
Donc dans les vues que j'ai ajouter un smart_unicode ligne au-dessus de la parsed_feed ligne de codage...
content = smart_unicode(content, encoding='utf-8', strings_only=False, errors='strict')
content = content = content.encode(parsed_feed.encoding, "xmlcharrefreplace")
Cette repousse le problème à mon models.py pour moi où j'ai
def save(self, force_insert=False, force_update=False):
if self.excerpt:
self.excerpt_html = markdown(self.excerpt)
# super save after this
Si je change la méthode save...
def save(self, force_insert=False, force_update=False):
if self.excerpt:
encoded_excerpt_html = (self.excerpt).encode('utf-8')
self.excerpt_html = markdown(encoded_excerpt_html)
Je reçois le message d'erreur "'ascii' codec ne peut pas décoder les octets 0xe2 en position 141: ordinal pas in range(128)" parce que maintenant il lit "\xe2\x80\x94" où le tiret cadratin était
Fondamentalement, quelle est la valeur de
parsed_feed.encoding
? Est-il 'ascii', par hasard? (qui pourrait expliquer à la fois vos erreurs).OriginalL'auteur user140314 | 2010-03-25
Vous devez vous connecter pour publier un commentaire.
Si les données que vous recevez est, en fait, encodé en UTF-8, alors il devrait être une séquence d'octets -- un Python 'str' object, en Python 2.X
Vous pouvez le vérifier avec une affirmation:
Une fois que vous savez que c'est vrai, vous pouvez passer à l'encodage. Python ne fait pas de transcodage, directement à partir de l'UTF-8 au format ASCII, par exemple. Vous devez d'abord activer votre séquence d'octets en une chaîne Unicode, par décodage:
(Si vous pouvez faire confiance parsed_feed.l'encodage, puis l'utiliser à la place de la lettre "utf-8'. De toute façon, être préparé pour les erreurs.)
Vous pouvez alors prendre cette chaîne, et l'encoder dans un format ASCII, la substitution des caractères avec leurs entité XML équivalents:
La méthode complète, puis, ressemblerait à quelque chose comme ceci:
OriginalL'auteur
Django fournit un couple de fonctions utiles pour la conversion en arrière et en avant entre Unicode et bytestrings:
Partie 2: je reçois le message d'erreur "'ascii' codec ne peut pas décoder les octets 0xe2 en position 141: ordinal pas in range(128)" parce que maintenant il lit "\xe2\x80\x94" où le tiret cadratin a été.
Pourriez-vous veuillez modifier votre post original avec ce qui précède? Il est très difficile de lire sans mise en forme appropriée.
vous êtes le sauveur!
Grâce smart_unicode est génial !!
OriginalL'auteur
J'ai rencontré cette erreur lors de l'écriture d'un nom de fichier avec fichier zip. La suite n'a pas de
et la suivante travaillé
str()
sur une valeur unicode des caractères non-ASCII résultat serait exactement la même erreur que l'OP est de voir.Salut, c'est un point très important que vous faites. Je ne peux trouver aucune référence à ce que
str()
est en train de faire dans la documentation cependant, je attribut qui, pour moi, être un Python noob plus d'une faute dans le manuel. Où est-ce documenté, ce qui est exactementstr()
faire à l'argument, et ce, précisément,str()
retour? Merci!str()
renvoie un chaîne d'octets, ainsi que des personnages avec des valeurs entre 0 et 255, avec 0-127 généralement interprété et affiché en tant que caractères ASCII. Ununicode()
valeur, d'autre part, peut représenter n'importe quel codepoint dans le standard Unicode, entre 0 et 1114111. Donc, en utilisantstr(unicodevalue)
à son tour unicode en une chaîne d'octets va impliquer transformation.Le
unicode
type est implémenté en C, mais il fournit l'API C de l'équivalent de la__str__
crochet pour faire cette transformation; la application appellePyUnicode_AsEncodedString()
, et que la fonction utilisePyUnicode_GetDefaultEncoding()
; deviner ce que cette fonction n'. 🙂Puisque vous ne pouvez pas passer dans un encodage à
str()
, Python n'est pas un choix, mais d'utiliser le codage par défaut. Il est donc toujours beaucoup mieux pour coder explicitement à une chaîne d'octets, lorsque vous avez besoin de ce dernier. N'utilisez pas destr(unicodevalue)
; il est rarement une bonne idée.OriginalL'auteur