Ruby-Zeichencodierung bei Verwendung von Base64.encode

8

Wenn ich mir die Quelle von Base64.encode von Ruby anschaue, kann ich vor der Kodierung dieser Daten in Base64 nicht bestimmen, in welche Zeichenkodierung eine Zeichenkette konvertiert wird, wenn überhaupt. Eine in Base64 codierte Utf-8-Zeichenfolge wird sich stark von einer in Base64 codierten Utf-16-Zeichenfolge unterscheiden. Verspricht Ruby diese Operation?

    
Brent 16.05.2013, 19:22
quelle

2 Antworten

6

Das gute Handbuch hat das zu sagen :

  

encode64 (bin)
  Gibt die Base64-codierte Bin-Version zurück. Diese Methode entspricht RFC 2045.

Abschnitt 6.8 von RFC 2045 sagt:

  

6.8. Base64 Content-Transfer-Encoding

     

Das Base64 Content-Transfer-Encoding wurde entwickelt, um beliebige Sequenzen von Oktetten in einer Form darzustellen, die nicht für Menschen lesbar sein muss. [...]

     

Es wird eine aus 65 Zeichen bestehende Teilmenge von US-ASCII verwendet, wodurch 6 Bits pro druckbarem Zeichen dargestellt werden können. (Das zusätzliche 65. Zeichen, "=", wird verwendet, um eine spezielle Verarbeitungsfunktion zu bezeichnen.)

So codiert Base64 Bytes in ASCII. Wenn diese Bytes tatsächlich eine UTF-8-codierte Zeichenfolge darstellen, wird die UTF-8-Zeichenfolge in einzelne Bytes unterteilt, und diese Bytes werden in Base64 konvertiert. Wenn Sie zum Beispiel eine UTF-8-Zeichenfolge 'µ' haben, werden Sie die Bytes 0xc2 und 0xb5 (in dieser Reihenfolge) in die Base64-Darstellung "wrU=\n" codieren. Wenn Sie mit einer binären Zeichenkette "\xc2\xb5" beginnen (die zufälligerweise mit der UTF-8-Version von 'µ' übereinstimmt), erhalten Sie dieselbe "wrU=\n" -Ausgabe.

Wenn Sie "wrU=\n" dekodieren, erhalten Sie die Bytes "\xc2\xb5" , und Sie müssen wissen, dass diese Bytes UTF-8-kodierter Text sein sollen und nicht irgendein willkürlicher Blob von Bits. Aus diesem Grund haben Sie separate Inhaltstyp- und Zeichensatz-Metadaten an Base64 angehängt.

Wenn Sie eine UTF-16-Zeichenfolge haben, wird sie ebenfalls in Bytes aufgeteilt und diese Bytes werden wie jede andere Byte-Zeichenfolge codiert. Natürlich ist dieser Fall aufgrund von Problemen mit der Byte-Reihenfolge etwas komplizierter, aber deshalb haben wir Inhaltstyp- und Zeichensatz-Header und -BOMs.

Der Hauptpunkt ist, dass Base64 mit Bytes arbeitet, keine Zeichen. Welches Format (UTF-8 Text, UTF-16 Text, ein PNG Bild, ...) ist das Problem eines anderen. Base64 konvertiert nur einen Byte-Stream in eine Teilmenge von US-ASCII und dann zurück in Bytes; Das Format dieser Bytes muss separat angegeben werden.

Ich habe in der Quelle herumgestochert und die Ergebnisse könnten von Interesse sein, selbst wenn sie nicht vollständig relevant sind. Die Methode encode64 ist einfach so:

%Vor%

Wenn Sie dann durch Array#pack schauen:

%Vor%

und behalten Sie enc_info im Auge, Sie werden sehen, dass ein 'm' -Format enc_info alleine lässt, damit die gepackte Zeichenkette als US-ASCII ausgegeben wird und so encode64 US-ASCII-Ausgabe erzeugt erwartet.

    
mu is too short 17.05.2013, 00:21
quelle
19

Ein Beispiel zum Codieren und Decodieren einer utf-8-Zeichenfolge in base64:

%Vor%     
Victor Lellis 16.05.2013 20:11
quelle

Tags und Links