chaîne de codage et de décodage?
Voici mes tentatives avec des messages d'erreur. Ce que je fais mal?
string.decode("ascii", "ignore")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 37: ordinal not in range(128)
string.encode('utf-8', "ignore")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 37: ordinal not in range(128)
- Quelle est la valeur de
string
? De quel type est-il? - Il ne fait pas de sens pour décoder un objet Unicode, car il est déjà en forme décodé. Lorsque vous appelez unicode_object.decode(), Python suppose que vous voulez décoder une chaîne d'octets en Unicode à la place. Il tente d'abord de coder l'Unicode objet comme une chaîne d'octets à l'aide de votre système de codage par défaut -- c'est la véritable erreur que vous voyez.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas décoder un
unicode
, et vous ne pouvez pas encoder unstr
. Essayez de le faire dans l'autre sens.str
est vraiment une séquence d'octets (en Python 2.x). Vous décoder un UTF-8 séquence d'octets en une chaîne Unicode, et de l'encodage d'une chaîne Unicode en UTF-8 séquence d'octets. En d'autres termes, ce qui est mal, c'est le nomstr
(au lieu de l'encodage/décodage de l'ordre), ce qui fixe à 3.x.text = unicode(text)
puistext.encode('utf-8')
Deviner à toutes les choses omises de la question d'origine, mais, en supposant que Python 2.x la clé est de lire les messages d'erreur attentivement: en particulier lorsque vous appelez "coder", mais le message dit "décoder" et vice versa, mais aussi les types des valeurs incluses dans les messages.
Dans le premier exemple
string
est de typeunicode
et vous avez tenté de décoder ce qui est une opération de la conversion d'une chaîne d'octets à unicode. Python utilement tenté de convertir la valeur unicode pourstr
à l'aide de l'option par défaut 'ascii' encodage mais depuis votre chaîne contenue un caractère non-ascii-vous obtenu l'erreur qui dit que Python a été incapable de encoder un unicode valeur. Voici un exemple qui montre le type de la chaîne d'entrée:Dans le second cas, vous faites l'inverse de la tentative de coder une chaîne d'octets. L'encodage est une opération qui convertit unicode pour une chaîne d'octets, de sorte Python utilement tente de convertir votre chaîne d'octets unicode premier et, puisque vous ne lui donnez pas une chaîne de caractères ascii par défaut ascii décodeur échoue:
Côté de se
decode
etencode
en arrière, je pense qu'une partie de la réponse ici est en fait de ne pas utiliser leascii
encodage. Ce n'est probablement pas ce que vous voulez.Pour commencer, pensez à
str
comme vous le feriez d'un fichier de texte brut. C'est juste un tas d'octets avec l'encodage n'réellement attaché à elle. Comment c'est interprété est jusqu'à ce morceau de code est de le lire. Si vous ne savez pas ce que ce paragraphe est d'en parler, allez lire Joël Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères dès maintenant avant d'aller plus loin.Naturellement, nous sommes tous conscients de la pagaille qui a créé. La réponse est, à tout le moins à l'intérieur de la mémoire, ont un codage standard pour toutes les chaînes. C'est là que
unicode
vient dans. Je vais avoir du mal à suivre exactement ce que le codage Python utilise en interne pour sûr, mais il n'a pas vraiment d'importance pour cette seule raison. Le point est que vous savez que c'est une séquence d'octets qui sont interprétés d'une certaine manière. Si vous avez seulement besoin de réfléchir sur les personnages eux-mêmes, et non pas les octets.Le problème est que, dans la pratique, vous rencontrez les deux. Certaines bibliothèques de vous donner un
str
, et certains s'attendent à unstr
. Certes, cela fait sens quand vous êtes à la diffusion d'une série d'octets (comme les vers ou depuis le disque dur ou sur un site web demande). Donc, vous devez être en mesure de traduire en arrière et en avant.Entrer
codecs
: c'est la bibliothèque de traduction entre ces deux types de données. Vous utilisezencode
pour générer une séquence d'octets (str
) à partir d'une chaîne de texte (unicode
), et que vous utilisezdecode
pour obtenir une chaîne de texte (unicode
) à partir d'une séquence d'octets (str
).Par exemple:
Ce qui s'est passé ici? J'ai donné Python une séquence d'octets, et puis je l'ai dit, "Donnez-moi le
unicode
version de ce, étant donné que cette séquence d'octets est dans'utf-8'
." Il l'a fait comme je l'ai demandé, et ceux octets (un caractère du coeur) sont maintenant traitées comme un tout, représentés par leurs Unicode codepoint.Allons dans l'autre sens:
J'ai donné Python une chaîne Unicode, et j'ai demandé à traduire la chaîne en une séquence d'octets à l'aide de la
'utf-8'
encodage. Ainsi, il a fait, et maintenant le cœur est juste un tas d'octets qu'il ne peut pas imprimer au format ASCII; de sorte qu'il me montre le code hexadécimal de la place.Nous pouvons travailler avec d'autres encodages, trop, bien sûr:
(
'\xa7'
est le la section de caractère, dans les deuxUnicode et en Latin-1.)
Donc pour répondre à votre question, vous devez d'abord comprendre ce que le codage de votre
str
est en.Fait-il à partir d'un fichier? À partir d'une requête web? À partir de votre base de données? Puis la source détermine l'encodage. Découvrez le codage de la source et de l'utiliser pour les traduire dans un
unicode
.Ou peut-être que vous essayez de l'écrire quelque part. Ce codage ne la destination attendre? L'utiliser pour les traduire dans un
str
. UTF-8 est un bon choix pour les documents en texte ordinaire; la plupart des choses peuvent le lire.Sont que vous venez de traduire en arrière dans la mémoire de l'interopérabilité ou quelque chose? Ensuite, il suffit de choisir un encodage et le bâton avec elle;
'utf-8'
est probablement le meilleur choix pour qui:Dans la programmation moderne, vous probablement ne voulez pas utiliser le
'ascii'
codant pour tout de ce. C'est un très petit sous-ensemble de tous les caractères possibles, et l'absence de système que je connais utilise par défaut ou quoi que ce soit.Python 3 fait de son mieux pour faire de cette immensément plus claire, simplement en changeant les noms. En Python 3,
str
a été remplacé parbytes
, etunicode
a été remplacé parstr
.C'est parce que votre chaîne d'entrée ne peuvent pas être converties selon les règles de codage (stricte par défaut).
Je ne sais pas, mais j'ai toujours codé en utilisant directement unicode() constructeur, à moins que les moyens à la la documentation officielle:
unicode("\xe2\x9d\xa4", errors='ignore')
donneu''
.) Si c'est une solution acceptable, alors ce pourrait être d'accord. Je ne peux pas imaginer que la perte de données est acceptable dans la majorité des situations. À tout le moins, cette réponse doit exposer sur la pertinence de le faire.