Cố gắng giải quyết this issue, Tôi đang cố gắng bọc đầu quanh các chức năng khác nhau trong thư viện chuẩn Python nhằm hỗ trợ RFC 2231. Mục đích chính của RFC đó là gấp ba lần: cho phép mã hóa không phải ASCII trong các tham số đầu, chú ý ngôn ngữ của một giá trị đã cho và cho phép các tham số tiêu đề trải rộng trên nhiều dòng. Các email.util
library cung cấp một số chức năng để đối phó với các khía cạnh khác nhau về điều này. Theo như tôi có thể nói, họ làm việc như sau:Giải mã tiêu đề RFC 2231
decode_rfc2231
chỉ chia tách giá trị của một tham số đó vào bộ phận của nó, như thế này:
>>> email.utils.decode_rfc2231("utf-8''T%C3%A4st.txt")
['utf-8', '', 'T%C3%A4st.txt']
decode_params
chăm sóc phát hiện thông số RFC2231-mã hóa. Nó thu thập các phần thuộc về nhau và cũng giải mã chuỗi được mã hóa url thành chuỗi byte. Tuy nhiên, chuỗi byte này sau đó được mã hóa thành latin1. Và tất cả các giá trị được đặt trong dấu ngoặc kép. Hơn nữa, có một số xử lý đặc biệt cho đối số đầu tiên, mà vẫn phải là một bộ gồm hai phần tử, nhưng hai thứ đó được chuyển đến kết quả mà không sửa đổi.
>>> 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
có thể được sử dụng để chuyển đổi chuỗi mã hóa, ngôn ngữ và byte này thành chuỗi unicode phù hợp. Điều gì khiến tôi bối rối, mặc dù, là một thực tế là nếu đầu vào là như vậy ba, sau đó các dấu ngoặc kép sẽ được chuyển sang đầu ra. Mặt khác, nếu đầu vào là một chuỗi được trích dẫn, thì các dấu ngoặc kép này sẽ bị xóa.
>>> [(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"')]
Vì vậy, có vẻ như để sử dụng tất cả máy móc này, tôi phải thêm một bước nữa để bỏ yếu tố thứ ba của bất kỳ bộ dữ liệu nào tôi gặp phải. Điều này có đúng không, hoặc tôi đang thiếu một số điểm ở đây? Tôi đã tìm ra rất nhiều điều trên với sự trợ giúp từ mã nguồn, vì các tài liệu hơi mơ hồ về các chi tiết. Tôi không thể tưởng tượng cái gì có thể là điểm đằng sau sự lựa chọn không được chọn lọc này. Có điểm nào không?
Tham chiếu tốt nhất về cách sử dụng các chức năng này là gì?
Điều tốt nhất tôi tìm thấy cho đến nay là email.message.Message
implementation. Ở đó, quy trình dường như gần như được nêu ở trên, nhưng mọi trường được bỏ qua _unquotevalue
sau decode_params
và chỉ get_filename
và get_boundary
thu gọn giá trị của chúng, tất cả các trường khác sẽ trả về một bộ dữ liệu thay thế. Tôi hy vọng có cái gì đó hữu ích hơn.
Không phải là câu trả lời, nhưng chúng tôi đã có một cuộc thảo luận dài về RFC 2231 có thể hữu ích cho bạn trong một câu hỏi. Đó là về các lĩnh vực hình thức, mặc dù. - http://stackoverflow.com/questions/20591599/why-arent-post-names-with-unicode-sent-correctly-when-using-multipart-form-data/20592910#20592910 –
@RobStarling: Cảm ơn! RFC 2231 đã [ám ảnh tôi một thời gian] [http://stackoverflow.com/q/13514713/1468366), đặc biệt là kể từ khi [ai đó chỉ ra] (https://github.com/facebook/tornado/pull/ 869 # issuecomment-23632083) rằng [HTML5 yêu cầu * không * sử dụng nó cho tên tệp] (http://www.w3.org/html/wg/drafts/html/master/forms.html#multipart-form-data) . Nhưng HTML5 không phải là một tiêu chuẩn được nêu ra ... – MvG
oh tuyệt vời. các nhân viên HTML5 đang điều chỉnh HTTP? Ugh. –