base64 Encoding Unicode-Strings in Python 2.7

9

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:

%Vor%

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?

    
Marcin 05.03.2012, 18:57
quelle

5 Antworten

2

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.

    
Dan Gerhardsson 05.03.2012, 19:16
quelle
15

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:

%Vor%

Ein guter Ausgangspunkt, um mehr über Unicode und Codierungen zu erfahren, sind die Python-Dokumente und

Cameron 05.03.2012 19:06
quelle
5

Ich würde vorschlagen, es vor der base64-Codierung zu etwas wie UTF-8 zu kodieren:

%Vor%     
Simon Jagoe 05.03.2012 19:06
quelle
1

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.

    
Mark Ransom 05.03.2012 20:28
quelle
0

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%     
SpootDev 05.03.2012 22:26
quelle