UnicodeEncodeError: "latin-1" codec ne peut pas encoder les caractères
Ce qui pourrait être la cause de cette erreur lorsque j'essaie d'insérer un caractère étranger dans la base de données?
>>UnicodeEncodeError: 'latin-1' codec can't encode character u'\u201c' in position 0: ordinal not in range(256)
Et comment puis-je le résoudre?
Merci!
- db = MySQLdb.connect(host="localhost", user = "root", passwd = "", db = "testdb", use_unicode=True, charset="utf8")
- wow, @KyungHoonKim vous avez sauvé ma vie ! Vous y êtes !
Vous devez vous connecter pour publier un commentaire.
Caractère U+201C Gauche Double guillemet n'est pas présent dans le Latin-1 (ISO-8859-1) codage.
Il est présent dans la page de code 1252 (europe Occidentale). C'est un Windows-codage spécifique qui est basé sur la norme ISO-8859-1, mais qui met des caractères supplémentaires dans la gamme 0x80-0x9F. La page de Code 1252 est souvent confondu avec de l'ISO-8859-1, et il est gênant mais aujourd'hui, navigateur web standard comportement que si vous servez vos pages ISO-8859-1, le navigateur va les traiter comme des cp1252 à la place. Cependant, ils sont vraiment distinguer deux codages:
Si vous êtes en utilisant votre base de données uniquement comme un octet store, vous pouvez utiliser cp1252 pour encoder
“
et les autres personnages présents dans les Fenêtres de l'Ouest de la page de code. Mais encore d'autres caractères Unicode qui ne sont pas présents dans cp1252 va provoquer des erreurs.Vous pouvez utiliser
encode(..., 'ignore')
pour supprimer les erreurs en se débarrassant des personnages, mais vraiment dans ce siècle, vous devriez être en utilisant UTF-8 dans votre base de données et de vos pages. Ce codage permet à n'importe quel caractère à être utilisé. Vous devez également idéalement dire à MySQL que vous utilisez des chaînes UTF-8 (par réglage de la connexion de base de données et le classement sur les colonnes de la chaîne), afin d'obtenir des comparaison sensible à la casse et le tri.cp1252
un sur-ensemble strict de la norme ISO-8859-1? I. e. quand les navigateurs recevoir un ISO-8859-1 page, qu'ils peuvent rendre, comme si c'était CP1252 parce qu'il n'y aura pas de caractères à partir de la gamme0x80-0x9F
de toute façon.J'ai rencontré ce même problème lors de l'utilisation de Python module MySQLdb. Depuis MySQL vous permettra de stocker à peu près toutes les données binaires que vous voulez dans un champ de texte, quel que soit le jeu de caractères, j'ai trouvé ma solution ici:
À l'aide de l'UTF8 avec Python MySQLdb
Edit: Citation de l'URL ci-dessus afin de satisfaire la demande dans le premier commentaire...
J'espère que votre base de données est au moins UTF-8. Ensuite, vous aurez besoin d'exécuter
yourstring.encode('utf-8')
avant d'essayer de les mettre dans la base de données.La meilleure solution est
aime ce commentaire(ajouter
use_unicode=True
etcharset="utf8"
)de détail, voir :
utf8mb4
pour mysql si le fait d'avoiremoji
.etc, reportez-vous à what-is-the-difference-between-utf8mb4-and-utf8-charsets-in-mysqlVous essayez de stocker une Unicode codepoint
\u201c
en utilisant un codageISO-8859-1 /Latin-1
qui ne peuvent pas décrire ce que codepoint. Vous pourriez avoir besoin de modifier la base de données à utiliser l'utf-8, et de stocker les données de la chaîne à l'aide d'un codage approprié, ou vous pourriez vouloir stérilisez vos entrées avant de ranger le contenu; c'est à dire à l'aide de quelque chose comme Sam Ruby est un excellent guide i18n. Les discussions sur les questions quiwindows-1252
peut causer, et suggère comment la traiter, ainsi que des liens vers des exemples de code!SQLAlchemy les utilisateurs peuvent spécifier leur domaine comme
convert_unicode=True
.Exemple:
sqlalchemy.String(1000, convert_unicode=True)
SQLAlchemy sera tout simplement accepter de l'unicode des objets et de les retourner en arrière, de la manipulation de l'encodage de lui-même.
Docs
Latin-1 (alias ISO 8859-1) est d'un seul octet caractère schéma de codage, et vous ne pouvez pas répondre à
\u201c
(“
) dans un octet.Avez-vous l'intention d'utiliser l'encodage UTF-8?
\u0391
s'inscrit bien dans un octet (en particulier, les octets 193). Vous à vous voulez prendre un coup d'oeil à that; les gens l'ont trouvé utile.Utiliser l'extrait de code ci-dessous pour convertir le texte du Latin à l'anglais
de sortie:
Python: Vous aurez besoin d'ajouter
# - * - coding: UTF-8 - * - (enlever les espaces autour * )
à la première ligne du fichier python. puis ajoutez les lignes suivantes au texte à encoder: .encode('ascii', 'xmlcharrefreplace'). Ce sera de remplacer tous les caractères unicode avec son équivalent ASCII.