Ich habe eine Unicode-Zeichenkette von einem Webservice mit dem Modul requests
abgerufen, enthält die Bytes von a Binärdokument (PCL, wie es passiert). Eines dieser Bytes hat den Wert 248, und der Versuch, es zu codieren, führt zu folgendem Fehler:
Ich finde das etwas überraschend, denn 248 liegt im Bereich eines vorzeichenlosen Bytes (und kann in einer Byte-Kette gehalten werden), aber meine eigentliche Frage ist: Was ist der beste oder richtige Weg, um diese Zeichenfolge zu codieren ?
Mein aktuelles Workaround ist das:
%Vor% Dies scheint korrekt zu funktionieren und das resultierende byte_string
kann base64-codiert sein, aber es scheint, als sollte es einen besseren Weg geben. Gibt es?
Da Sie mit binären Daten arbeiten, bin ich mir nicht sicher, ob es eine gute Idee ist, die UTF-8-Kodierung zu verwenden. Ich denke, es hängt davon ab, wie Sie die base64-kodierte Darstellung verwenden wollen. Ich denke, es wäre wahrscheinlich besser, wenn Sie die Daten als eine Byte-Zeichenfolge und nicht als eine Unicode-Zeichenfolge abrufen können. Ich habe die Bibliothek für Anfragen nie verwendet, aber das Durchsuchen der Dokumentation deutet darauf hin, dass dies möglich ist. Es gibt Abschnitte, die über "Binary Response Content" und "Raw Response Content" sprechen.
Sie haben eine unicode
-Zeichenfolge, die Sie für Base64 kodieren möchten. Das Problem ist, dass b64encode()
nur für Bytes , nicht für Zeichen funktioniert. Sie müssen also Ihre unicode
-Zeichenfolge (eine Folge von abstrakten Unicode-Codepunkten) in eine Bytezeichenfolge umwandeln.
Das Mapping von abstrakten Unicode-Strings in eine konkrete Byte-Reihe wird encoding genannt. Python unterstützt mehrere Kodierungen; Ich schlage die weit verbreitete UTF-8-Kodierung vor:
%Vor% Beachten Sie, dass derjenige, der die Bytes dekodiert, auch wissen muss, welche Kodierung verwendet wurde, um eine unicode
-Zeichenfolge über die komplementäre Funktion decode()
zurückzubekommen:
Ein guter Ausgangspunkt, um mehr über Unicode und Codierungen zu erfahren, sind die Python-Dokumente und
Ich würde vorschlagen, es vor der base64-Codierung zu etwas wie UTF-8 zu kodieren:
%Vor% Es sollte möglich sein, die Antwort als Binärbytes zu erhalten und die Decodierungs- und Codierschritte vollständig zu überspringen. Es besteht immer die Möglichkeit, dass requests
eine Codierung auswählt, die einige Daten oder Fehler während des Roundtrips verliert.
Dieser Teil der Dokumentation heißt "Binary Response Content" scheint perfekt zu Ihrem Problem zu passen.
Wenn es binäre Daten sind ... warum überhaupt codieren / decodieren? Speziell der "base64.encodetring" -Teil. Im Folgenden wird beschrieben, wie ich Bilder in base64 kodiere, um sie direkt in meinen Python-Code einzufügen, anstatt zusätzliche Dateien zu haben. 2.7.2 btw
%Vor%Tags und Links python character-encoding base64 unicode-string python-unicode