Ich habe ein Problem mit der Codierung des Pfades variabel und an die Einfügen von SQLite - Datenbank. Ich habe versucht, es mit der Codierungsfunktion ("utf-8") zu lösen, was nicht geholfen hat. Dann habe ich die Funktion unicode () verwendet, die mir den Typ unicode gibt .
print type(path) # <type 'unicode'>
path = path.replace("one", "two") # <type 'str'>
path = path.encode("utf-8") # <type 'str'> strange
path = unicode(path) # <type 'unicode'>
Schließlich habe ich Unicode - Typ, aber ich habe immer den gleichen Fehler haben , die vorhanden war , als der Typ der Pfad - Variable war str
sqlite3.ProgrammingError: Sie dürfen keine 8-Bit-Bytestrings verwenden, es sei denn, Sie verwenden eine text_factory, die 8-Bit-Bytestrings interpretieren kann (wie text_factory = str). Es wird dringend empfohlen, stattdessen nur Ihre Anwendung auf Unicode-Zeichenfolgen umzustellen.
Können Sie mir helfen, diesen Fehler zu beheben und die korrekte Verwendung encode("utf-8")
und unicode()
Funktionen zu erklären ? Ich kämpfe oft damit.
BEARBEITEN:
Diese execute () - Anweisung hat den Fehler ausgelöst:
cur.execute("update docs set path = :fullFilePath where path = :path", locals())
Ich habe vergessen, die Codierung der Variablen fullFilePath zu ändern, die unter demselben Problem leidet, bin aber jetzt ziemlich verwirrt. Sollte ich nur Unicode () oder Encode ("utf-8") oder beides verwenden?
Ich kann nicht verwenden
fullFilePath = unicode(fullFilePath.encode("utf-8"))
weil es diesen Fehler auslöst:
UnicodeDecodeError: Der Codec 'ascii' kann das Byte 0xc5 an Position 32 nicht dekodieren: Ordnungszahl nicht im Bereich (128)
Die Python- Version ist 2.7.2
unicode
?Antworten:
Sie verwenden
encode("utf-8")
falsch. Python-Byte-Strings (str
Typ) haben eine Codierung, Unicode nicht. Sie könnenuni.encode(encoding)
eine Unicode-Zeichenfolge mithilfe vons.decode(encoding)
(oder gleichwertigunicode(s, encoding)
) in eine Python-Byte-Zeichenfolge konvertieren und eine Byte-Zeichenfolge in eine Unicode-Zeichenfolge konvertieren .Wenn
fullFilePath
undpath
derzeit einstr
Typ sind, sollten Sie herausfinden, wie sie codiert sind. Wenn die aktuelle Codierung beispielsweise utf-8 ist, würden Sie Folgendes verwenden:Wenn dies das Problem nicht behebt, besteht das eigentliche Problem möglicherweise darin, dass Sie in Ihrem
execute()
Aufruf keine Unicode-Zeichenfolge verwenden . Versuchen Sie, diese wie folgt zu ändern:quelle
fullFilePath = fullFilePath.decode("utf-8")
löst immer noch einen Fehler ausUnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128)
. fullFilePath ist eine Kombination aus Typ str und Zeichenfolge aus genommen Textspalte DB - Tabelle , die UTF-8 - Codierung sein sollte.str
Objekte kombinieren , mischen Sie möglicherweise Codierungen. Können Sie das Ergebnis von zeigenprint repr(fullFilePath)
?cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
str
ist eine Textdarstellung in Bytes,unicode
ist eine Textdarstellung in Zeichen.Sie dekodieren Text von Bytes zu Unicode und codieren einen Unicode mit einer gewissen Codierung in Bytes.
Das ist:
quelle
unicode
über Buchstaben oder Symbole oder allgemeiner gesprochen wird: Runen, währendstr
sie eine Byte-Zeichenfolge in einer bestimmten Codierung darstellen, die Siedecode
(offensichtlich in der richtigen Codierung)Stellen Sie sicher, dass Sie Ihre Gebietsschemaeinstellungen direkt vor dem Ausführen des Skripts über die Shell festgelegt haben, z
Docs:
man locale
,man setlocale
.quelle