Was kann diesen Fehler verursachen, wenn ich versuche, ein Fremdzeichen in die Datenbank einzufügen?
>>UnicodeEncodeError: 'latin-1' codec can't encode character u'\u201c' in position 0: ordinal not in range(256)
Und wie löse ich das?
Vielen Dank!
Antworten:
Das linke doppelte Anführungszeichen für das Zeichen U + 201C ist in der Latin-1-Codierung (ISO-8859-1) nicht vorhanden.
Es ist auf der Codepage 1252 (Westeuropa) enthalten. Dies ist eine Windows-spezifische Codierung, die auf ISO-8859-1 basiert, jedoch zusätzliche Zeichen in den Bereich 0x80-0x9F einfügt. Codepage 1252 wird häufig mit ISO-8859-1 verwechselt, und es ist ein ärgerliches, aber mittlerweile standardmäßiges Verhalten des Webbrowsers, dass der Browser Ihre Seiten stattdessen als cp1252 behandelt, wenn Sie sie als ISO-8859-1 bereitstellen. Es handelt sich jedoch tatsächlich um zwei unterschiedliche Codierungen:
Wenn Sie Ihre Datenbank nur als Byte-Speicher verwenden, können Sie cp1252 zum Codieren
“
und anderer Zeichen verwenden, die auf der Windows Western-Codepage vorhanden sind. Wieder andere Unicode-Zeichen, die in cp1252 nicht vorhanden sind, verursachen Fehler.Sie können
encode(..., 'ignore')
die Fehler unterdrücken, indem Sie die Zeichen entfernen. In diesem Jahrhundert sollten Sie jedoch UTF-8 sowohl in Ihrer Datenbank als auch auf Ihren Seiten verwenden. Diese Codierung ermöglicht die Verwendung eines beliebigen Zeichens. Idealerweise sollten Sie MySQL auch mitteilen, dass Sie UTF-8-Zeichenfolgen verwenden (indem Sie die Datenbankverbindung und die Sortierung für Zeichenfolgenspalten festlegen), damit der Vergleich und die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung richtig sind.quelle
cp1252
eine strikte Obermenge von ISO-8859-1? Wenn Browser eine ISO-8859-1-Seite erhalten, können sie diese so rendern, als wäre es CP1252, da0x80-0x9F
ohnehin keine Zeichen aus dem Bereich vorhanden sind .Ich bin auf dasselbe Problem gestoßen, als ich das Python MySQLdb-Modul verwendet habe. Da Sie mit MySQL nahezu alle gewünschten Binärdaten unabhängig vom Zeichensatz in einem Textfeld speichern können, habe ich hier meine Lösung gefunden:
Verwenden von UTF8 mit Python MySQLdb
Bearbeiten: Zitat aus der obigen URL, um die Anfrage im ersten Kommentar zu erfüllen ...
quelle
Die beste Lösung ist
mag diesen Kommentar (hinzufügen
use_unicode=True
undcharset="utf8"
)Detail siehe:
quelle
utf8mb4
wenn wiremoji
.etc haben. Beziehen Sie sich auf den Unterschied zwischen utf8mb4- und utf8-Zeichensätzen in mysqlIch hoffe, Ihre Datenbank ist mindestens UTF-8. Dann müssen Sie ausführen,
yourstring.encode('utf-8')
bevor Sie versuchen, es in die Datenbank zu stellen.quelle
Sie versuchen, einen Unicode-Codepunkt
\u201c
mit einer Codierung zu speichernISO-8859-1 / Latin-1
, die diesen Codepunkt nicht beschreiben kann. Möglicherweise müssen Sie die Datenbank ändern, um utf-8 zu verwenden, und die Zeichenfolgendaten mit einer geeigneten Codierung speichern, oder Sie möchten Ihre Eingaben vor dem Speichern des Inhalts bereinigen. dh mit etwas wie Sam Rubys ausgezeichnetem i18n-Leitfaden . Das spricht über die Probleme,windows-1252
die verursachen können, und schlägt vor, wie es verarbeitet werden soll, sowie Links zu Beispielcode!quelle
SQLAlchemy-Benutzer können einfach ihr Feld als angeben
convert_unicode=True
.Beispiel:
sqlalchemy.String(1000, convert_unicode=True)
SQLAlchemy akzeptiert einfach Unicode-Objekte und gibt sie zurück, wobei die Codierung selbst behandelt wird.
Docs
quelle
Latin-1 (auch bekannt als ISO 8859-1 ) ist ein Codierungsschema für einzelne Oktettzeichen, und Sie können
\u201c
(“
) nicht in ein Byte einpassen.Wollten Sie UTF-8-Codierung verwenden?
quelle
\u0391
passt dennoch gut in ein Byte (insbesondere Byte 193). Sie können einen Blick auf nehmen möchten , dass ; Leute haben es hilfreich gefunden.Verwenden Sie das folgende Snippet, um den Text von Latein nach Englisch zu konvertieren
Ausgabe:
quelle
Python: Sie müssen # - * - Kodierung: UTF-8 - * - (entfernen Sie die Leerzeichen um *) in die erste Zeile der Python-Datei einfügen. und fügen Sie dann dem zu codierenden Text Folgendes hinzu: .encode ('ascii', 'xmlcharrefreplace') . Dadurch werden alle Unicode-Zeichen durch das ASCII-Äquivalent ersetzt.
quelle