Próbuję adresować this issue, staram się owijać głowę wokół różnych funkcji w standardowej bibliotece Pythona mających na celu wspieranie RFC 2231. Główny cel tego RFC wydaje się być trzykrotny: zezwalanie na kodowanie inne niż ASCII w parametrach nagłówka, zwracanie uwagi na język danej wartości i pozwalanie parametrom nagłówka na rozciąganie wielu linii. Model email.util
library udostępnia kilka funkcji umożliwiających radzenie sobie z różnymi aspektami. O ile mogę powiedzieć, że działa w następujący sposób:Dekodowanie nagłówków RFC 2231
decode_rfc2231
dzieli tylko wartość takiego parametru w jego części, podobnie jak to:
>>> email.utils.decode_rfc2231("utf-8''T%C3%A4st.txt")
['utf-8', '', 'T%C3%A4st.txt']
decode_params
dba wykrywania parametrów RFC2231 kodowane. Gromadzi części, które należą do siebie, a także dekoduje łańcuch zakodowany w url do sekwencji bajtów. Ta sekwencja bajtów jest jednak kodowana jako łacińska1. Wszystkie wartości są ujęte w cudzysłowy. Co więcej, istnieje pewien specjalny sposób postępowania z pierwszym argumentem, który wciąż musi być krotką dwóch elementów, ale te dwie są przekazywane do wyniku bez modyfikacji.
>>> 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
może być użyty do konwersji to trójka, języka i kodowania sekwencji bajtów w odpowiednie ciąg Unicode. Tym, co mnie wprawiło w zakłopotanie, jest fakt, że jeśli dane wejściowe były tak potrójne, wówczas cytaty zostaną przeniesione na wyjście. Jeśli, z drugiej strony, dane wejściowe były pojedynczym cudzysłowem, wówczas te cytaty zostaną usunięte.
>>> [(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"')]
Wydaje się więc, że aby wykorzystać cały ten sprzęt, to muszę dodać kolejny krok do cytatu trzeci element każdej krotki bym spotkać. Czy to prawda, czy też brakuje mi tutaj jakiegoś punktu? Musiałem dowiedzieć się wielu powyższych z pomocą kodu źródłowego, ponieważ dokumenty są nieco niejasne na temat szczegółów. Nie mogę sobie wyobrazić, co może być przyczyną tego selektywnego niedopasowania. Czy to ma sens?
Jakie jest najlepsze odniesienie do korzystania z tych funkcji?
Najlepsze, co dotąd znalazłem to email.message.Message
implementation. Tam proces wydaje się być mniej więcej opisany powyżej, ale każde pole jest niecytowane przez _unquotevalue
po decode_params
, a tylko get_filename
i get_boundary
zwinąć ich wartości, wszystkie inne zwracają zamiast tego krotkę. Mam nadzieję, że jest coś bardziej użytecznego.
nie jest odpowiedź, ale mieliśmy długą dyskusję na temat RFC 2231, która może być przydatna w innym pytanie. Chodziło o pola formularzy. - http://stackoverflow.com/questions/20591599/why-arent-post-names-with-unicode-sent-orrectly-when-using-multipart-forma-data/20592910#20592910 –
@RobStarling: Dzięki! RFC 2231 już od pewnego czasu [nawiedza mnie] (http://stackoverflow.com/q/13514713/1468366), zwłaszcza, że [ktoś zauważył] (https://github.com/facebook/tornado/pull/ 869 # issuecomment-23632083), że [HTML5 wymaga * nie * używania go dla nazw plików] (http://www.w3.org/html/wg/drafts/html/master/forms.html#multipart-form-data) . Ale HTML5 nie jest jeszcze standardem ... – MvG
o super. ludzie HTML5 modyfikują HTTP? Ugh. –