Quelle 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 résoudre ce problème?
Merci!
Réponses:
Le caractère U + 201C Double guillemet gauche n'est pas présent dans le codage Latin-1 (ISO-8859-1).
Il est présent dans la page de codes 1252 (Europe de l'Ouest). Il s'agit d'un encodage spécifique à Windows basé sur ISO-8859-1 mais qui place des caractères supplémentaires dans la plage 0x80-0x9F. La page de code 1252 est souvent confondue avec ISO-8859-1, et c'est un comportement de navigateur Web ennuyeux mais désormais standard que si vous servez vos pages comme ISO-8859-1, le navigateur les traitera à la place comme cp1252. Cependant, ce sont vraiment deux encodages distincts:
Si vous utilisez votre base de données uniquement comme magasin d'octets, vous pouvez utiliser cp1252 pour coder
“
et d'autres caractères présents dans la page de codes Windows Western. Mais encore d'autres caractères Unicode qui ne sont pas présents dans cp1252 provoqueront des erreurs.Vous pouvez utiliser
encode(..., 'ignore')
pour supprimer les erreurs en supprimant les caractères, mais vraiment dans ce siècle, vous devriez utiliser UTF-8 à la fois dans votre base de données et vos pages. Cet encodage permet d'utiliser n'importe quel caractère. Vous devriez également idéalement indiquer à MySQL que vous utilisez des chaînes UTF-8 (en définissant la connexion à la base de données et le classement sur les colonnes de chaînes), afin qu'il puisse obtenir une comparaison et un tri insensibles à la casse.la source
cp1252
un sur-ensemble strict d'ISO-8859-1? C'est-à-dire que lorsque les navigateurs reçoivent une page ISO-8859-1, ils peuvent la restituer comme s'il s'agissait de CP1252 car il n'y aura de toute façon aucun caractère de la plage0x80-0x9F
.J'ai rencontré ce même problème lors de l'utilisation du module Python MySQLdb. Étant donné que MySQL vous permettra de stocker à peu près toutes les données binaires que vous souhaitez dans un champ de texte quel que soit le jeu de caractères, j'ai trouvé ma solution ici:
Utiliser UTF8 avec Python MySQLdb
Edit: Citation de l'URL ci-dessus pour satisfaire la demande dans le premier commentaire ...
la source
La meilleure solution est
faire comme ce commentaire (ajouter
use_unicode=True
etcharset="utf8"
)détail voir:
la source
utf8mb4
pour mysql si vousemoji
avez .etc, reportez-vous à quelle-est-la-différence-entre-utf8mb4-et-utf8-charsets-in-mysqlJ'espère que votre base de données est au moins UTF-8. Ensuite, vous devrez exécuter
yourstring.encode('utf-8')
avant d'essayer de le mettre dans la base de données.la source
Vous essayez de stocker un point de code Unicode à l'
\u201c
aide d'un codageISO-8859-1 / Latin-1
qui ne peut pas décrire ce point de code. Soit vous devrez peut-être modifier la base de données pour utiliser utf-8 et stocker les données de chaîne en utilisant un encodage approprié, soit vous voudrez peut-être nettoyer vos entrées avant de stocker le contenu; c'est-à-dire en utilisant quelque chose comme l'excellent guide i18n de Sam Ruby . Cela parle des problèmes quiwindows-1252
peuvent causer et suggère comment le traiter, ainsi que des liens vers un exemple de code!la source
Les utilisateurs de SQLAlchemy peuvent simplement spécifier leur champ comme
convert_unicode=True
.Exemple:
sqlalchemy.String(1000, convert_unicode=True)
SQLAlchemy acceptera simplement les objets Unicode et les retournera, en gérant l'encodage lui-même.
Docs
la source
Latin-1 (alias ISO 8859-1 ) est un schéma de codage de caractères à octet unique, et vous ne pouvez pas insérer
\u201c
(“
) dans un octet.Vouliez-vous utiliser l'encodage UTF-8?
la source
\u0391
s'intègre parfaitement dans un octet (en particulier, l'octet 193). Vous voudrez peut -être jeter un coup d'œil à cela ; les gens l'ont trouvé utile.Utilisez l'extrait ci-dessous pour convertir le texte du latin en anglais
production:
la source
Python: Vous devrez ajouter # - * - codage: UTF-8 - * - (supprimez les espaces autour de *) à la première ligne du fichier python. puis ajoutez ce qui suit au texte à encoder: .encode ('ascii', 'xmlcharrefreplace') . Cela remplacera tous les caractères Unicode par son équivalent ASCII.
la source