Ich versuche, this issue zu adressieren, ich versuche, den Kopf um die verschiedenen Funktionen in der Python-Standard-Bibliothek zur Unterstützung RFC 2231. Das Hauptziel dieses RFC scheint dreifach zu sein: Nicht-ASCII-Codierung in Header-Parametern zu erlauben, die Sprache eines gegebenen Wertes zu notieren und Header-Parameter zu erlauben, sich über mehrere Zeilen zu erstrecken. Die email.util
library bietet mehrere Funktionen, um mit verschiedenen Aspekten davon umzugehen. Soweit ich sagen kann, sie funktionieren wie folgt:Decoding RFC 2231 Header
decode_rfc2231
spaltet nur den Wert eines solchen Parameters in seine Teile, wie folgt aus:
>>> email.utils.decode_rfc2231("utf-8''T%C3%A4st.txt")
['utf-8', '', 'T%C3%A4st.txt']
decode_params
nimmt RFC2231-kodierten Parameter zu erfassen. Es sammelt Teile zusammen, die zusammen gehören, und dekodiert auch die url-codierte Zeichenfolge in eine Byte-Sequenz. Diese Bytefolge wird jedoch dann als latin1 codiert. Und alle Werte sind in Anführungszeichen eingeschlossen. Außerdem gibt es eine spezielle Behandlung für das erste Argument, das immer noch ein Tupel aus zwei Elementen sein muss, aber diese beiden werden ohne Änderung an das Ergebnis übergeben.
>>> email.utils.decode_params([
... (1,2),
... ("foo","bar"),
... ("name*","utf-8''T%C3%A4st.txt"),
... ("baz*0","two"),("baz*1","-part")])
[(1, 2), ('foo', '"bar"'), ('baz', '"two-part"'), ('name', ('utf-8', '', '"Täst.txt"'))]
collapse_rfc2231_value
kann diese dreifache der Codierung, Sprache und Bytefolge in eine geeignete Unicode-Zeichenfolge zu konvertieren verwendet werden. Was mich jedoch verwirrt hat, ist die Tatsache, dass, wenn die Eingabe so ein Tripel war, die Anführungszeichen auf die Ausgabe übertragen werden. Wenn die Eingabe andererseits eine einzelne Zeichenfolge in Anführungszeichen ist, werden diese Anführungszeichen entfernt.
>>> [(k, email.utils.collapse_rfc2231_value(v)) for k, v in
... email.utils.decode_params([
... (1,2),
... ("foo","bar"),
... ("name*","utf-8''T%C3%A4st.txt"),
... ("baz*0","two"),("baz*1","-part")])[1:]]
[('foo', 'bar'), ('baz', 'two-part'), ('name', '"Täst.txt"')]
So scheint es, dass, um alle diese Maschinen zu verwenden, würde ich noch einen weiteren Schritt hinzufügen müssen, um das dritte Element jedes Tupel unquote begegne ich hatte. Ist das wahr, oder fehlt mir hier ein Punkt? Ich musste viel von dem oben genannten mit Hilfe des Quellcodes herausfinden, da die Dokumente auf den Details ein wenig vage sind. Ich kann mir nicht vorstellen, was dieser selektive Verzicht sein könnte. Gibt es einen Sinn?
Was ist die beste Referenz zur Verwendung dieser Funktionen?
Die beste, die ich bis jetzt gefunden habe, ist die email.message.Message
implementation. Es scheint der Prozess in etwa die oben beschriebenen zu sein, aber jedes Feld über _unquotevalue
nach dem decode_params
unquoted wird, und nur get_filename
und get_boundary
Zusammenbruch ihre Werte, alle anderen zurückgeben anstelle eines Tupels. Ich hoffe, es gibt etwas Nützlicheres.
keine Antwort, aber wir hatten eine lange Diskussion über RFC 2231, die in einem anderen zu Ihnen sein könnte nützlich Frage. Es ging jedoch um Formularfelder. - http://stackoverflow.com/questions/20591599/why-arent-post-names-withunicode-sent-correctly-when-using-multipart-form-data/20592910#20592910 –
@RobStarling: Danke! RFC 2231 [quält mich schon seit einiger Zeit] (http://stackoverflow.com/q/13514713/1468366), insbesondere seit [jemand darauf hingewiesen hat] (https://github.com/facebook/tornado/pull/ 869 # issuecomment-23632083), dass [HTML5 verlangt, dass * es * nicht für Dateinamen verwendet wird] (http://www.w3.org/html/wg/drafts/html/master/forms.html#multipart-form-data) . Aber HTML5 ist noch kein Standard ... – MvG
oh toll. die HTML5-Leute optimieren HTTP? Pfui. –