Cercando di indirizzare lo this issue, sto cercando di comprendere le varie funzioni della libreria standard Python volte a supportare RFC 2231. L'obiettivo principale di tale RFC sembra essere triplice: consentire la codifica non ASCII nei parametri di intestazione, prendere nota della lingua di un determinato valore e consentire ai parametri dell'intestazione di estendersi su più righe. Il email.util
library fornisce diverse funzioni per affrontare vari aspetti di questo. Per quanto posso dire, essi funzionano come segue:Decodifica intestazioni RFC 2231
decode_rfc2231
divide solo il valore di tale parametro nelle sue parti, in questo modo:
>>> email.utils.decode_rfc2231("utf-8''T%C3%A4st.txt")
['utf-8', '', 'T%C3%A4st.txt']
decode_params
si occupa di rilevare parametri RFC2231 codificato. Raccoglie le parti che appartengono insieme e decodifica anche la stringa con codifica url in una sequenza di byte. Questa sequenza di byte, tuttavia, viene quindi codificata come latin1. E tutti i valori sono racchiusi tra virgolette. Inoltre, vi è una certa gestione speciale per il primo argomento, che deve ancora essere una tupla di due elementi, ma questi due vengono passati al risultato senza modifiche.
>>> 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
può essere utilizzato per convertire questo triplice di codifica, la lingua e la sequenza di byte in una stringa unicode corretta. Ciò che mi ha confuso, tuttavia, è il fatto che se l'input fosse una tale tripla, allora le virgolette saranno riportate all'output. Se, d'altra parte, l'input era una singola stringa quotata, allora queste virgolette saranno rimosse.
>>> [(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"')]
Così sembra che, al fine di utilizzare tutto questo macchinario, avrei dovuto aggiungere ancora un altro passo per unquote il terzo elemento di una tupla che avrei incontrato. È vero o mi manca qualche punto qui? Ho dovuto capire molto di quanto sopra con l'aiuto del codice sorgente, dato che i documenti sono un po 'vaghi sui dettagli. Non riesco a immaginare quale potrebbe essere il punto dietro questo smembramento selettivo. C'è un punto in esso?
Qual è il miglior riferimento su come utilizzare queste funzioni?
Il migliore che ho trovato finora è lo email.message.Message
implementation. Lì, il processo sembra essere approssimativamente quello descritto sopra, ma ogni campo diventa non quotato tramite _unquotevalue
dopo il decode_params
e solo get_filename
e get_boundary
comprime i loro valori, tutti gli altri restituiscono invece una tupla. Spero ci sia qualcosa di più utile.
Non una risposta, ma abbiamo avuto una lunga discussione su RFC 2231 che potrebbe essere utile a voi in un altro domanda. Si trattava di campi di forma, però. - http://stackoverflow.com/questions/20591599/why-arent-post-names-with-unicode-sent-correctly-when-using-multipart-form-data/20592910#20592910 –
@RobStarling: Grazie! RFC 2231 è stato [ossessionante per me da un po 'di tempo] (http://stackoverflow.com/q/13514713/1468366), soprattutto dal momento che [qualcuno ha sottolineato] (https://github.com/facebook/tornado/pull/ 869 # issuecomment-23632083) che [HTML5 richiede * non * di utilizzarlo per i nomi dei file] (http://www.w3.org/html/wg/drafts/html/master/forms.html#multipart-form-data) . Ma HTML5 non è ancora uno standard ... – MvG
oh fantastico. le persone HTML5 stanno modificando HTTP? Ugh. –