2013-08-07 13 views
15

this issue को संबोधित करने का प्रयास कर रहा है, मैं पाइथन मानक लाइब्रेरी में विभिन्न कार्यों के चारों ओर अपने सिर को लपेटने की कोशिश कर रहा हूं जिसका उद्देश्य RFC 2231 का समर्थन करना है। आरएफसी का मुख्य उद्देश्य तीन गुना प्रतीत होता है: किसी दिए गए मान की भाषा को ध्यान में रखते हुए, हेडर पैरामीटर में गैर-ASCII एन्कोडिंग की अनुमति देता है, और हेडर पैरामीटर को एकाधिक लाइनों को फैलाने की इजाजत देता है। email.util library इस के विभिन्न पहलुओं से निपटने के लिए कई कार्य प्रदान करता है। जहाँ तक मेरा बता सकते हैं, वे इस प्रकार काम करते हैं:डीएफसी आरएफसी 2231 हेडर

decode_rfc2231 केवल, अपने हिस्से में इस तरह के एक पैरामीटर का मान विभाजन इस तरह:

>>> email.utils.decode_rfc2231("utf-8''T%C3%A4st.txt") 
['utf-8', '', 'T%C3%A4st.txt'] 

decode_params RFC2231 एन्कोड मानकों का पता लगाने का ख्याल रखता है। यह उन हिस्सों को एकत्र करता है जो एक साथ हैं, और एक बाइट अनुक्रम में यूआरएल-एन्कोडेड स्ट्रिंग को भी डीकोड करते हैं। हालांकि, इस बाइट अनुक्रम को लैटिन 1 के रूप में एन्कोड किया गया है। और सभी मूल्य उद्धरण चिह्नों में संलग्न हैं। इसके अलावा, पहले तर्क के लिए कुछ विशेष हैंडलिंग है, जो अभी भी दो तत्वों का एक गुच्छा होना है, लेकिन उन दोनों को संशोधन के बिना परिणाम में पारित किया गया है।

>>> 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 एक उचित यूनिकोड स्ट्रिंग में एन्कोडिंग, भाषा और बाइट क्रम के इस ट्रिपल कन्वर्ट करने के लिए इस्तेमाल किया जा सकता। हालांकि, मुझे उलझन में क्या तथ्य है कि अगर इनपुट इतना ट्रिपल था, तो उद्धरण आउटपुट पर ले जाया जाएगा। यदि, दूसरी तरफ, इनपुट एक उद्धृत स्ट्रिंग था, तो इन उद्धरणों को हटा दिया जाएगा।

>>> [(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"')] 

तो ऐसा लगता है कि इस सब मशीनरी का उपयोग करने के, मैं किसी भी टपल मैं मुठभेड़ चाहते हैं के तीसरे तत्व गंदें शब्द बोलना के लिए अभी तक एक और कदम जोड़ने के लिए होगा। क्या यह सच है, या क्या मुझे यहां कुछ बिंदु याद आ रही है? मुझे स्रोत कोड से सहायता के साथ उपर्युक्त में से कुछ को समझना पड़ा, क्योंकि दस्तावेज़ विवरण पर थोड़ा अस्पष्ट हैं। मैं कल्पना नहीं कर सकता कि इस चुनिंदा निर्विवाद के पीछे क्या बिंदु हो सकता है। क्या इसका कोई मुद्दा है?

इन कार्यों का उपयोग करने के तरीके पर सबसे अच्छा संदर्भ क्या है?

अब तक का सबसे अच्छा पाया गया है email.message.Messageimplementation। वहाँ, इस प्रक्रिया को मोटे तौर पर एक ऊपर उल्लिखित प्रतीत हो रहा है, लेकिन हर क्षेत्र decode_params के बाद _unquotevalue के माध्यम से गैर उद्धृत हो जाता है, और केवल get_filename और get_boundary पतन उनके मूल्यों, अन्य सभी को एक टपल बजाय वापस जाएँ। मुझे आशा है कि कुछ और उपयोगी होगा।

+1

नहीं एक जवाब है, लेकिन हम RFC 2231 के बारे में एक लंबे चर्चा है कि किसी अन्य रूप में आप के लिए उपयोगी हो सकता है के लिए किया था सवाल। यह फार्म फ़ील्ड के बारे में था, हालांकि। - http://stackoverflow.com/questions/20591599/why-arent-post-names-with-unicode-sent-correctly-when-using-multipart-form-data/20592910#20592910 –

+0

@RobStarling: धन्यवाद! आरएफसी 2231 [मुझे कुछ समय के लिए परेशान कर रहा है] (http://stackoverflow.com/q/13514713/1468366), खासकर जब से [किसी ने इंगित किया] [https://github.com/facebook/tornado/pull/ 869 # मुद्दा-23632083) कि [HTML5 को फ़ाइल नामों के लिए * इसका उपयोग नहीं करना चाहिए] (http://www.w3.org/html/wg/drafts/html/master/forms.html#multipart-form-data) । लेकिन एचटीएमएल 5 अभी तक मानक नहीं है ... – MvG

+0

ओह महान। एचटीएमएल 5 लोग HTTP tweaking कर रहे हैं? ओह। –

उत्तर

4

वर्तमान में email.utils से फ़ंक्शंस का उपयोग शायद ही कभी email.message के भीतर किया जाता है। अधिकांश उपयोगकर्ता सीधे email.message.Message का उपयोग करना पसंद करते हैं। यहां तक ​​कि कुछ हद तक एक वर्ष issue report इकाई परीक्षण (जो निश्चित रूप से उदाहरण के रूप में प्रयोग करने योग्य हो जाएगा) अजगर को जोड़ने, भले ही मैं इसे कैसे email.util से संबंधित है पर यकीन नहीं है पर है।

मुझे मिला एक छोटा सा उदाहरण this blogpost है, हालांकि, इसमें एक से अधिक वाक्य और आरएफसी 2231 पार्सिंग के बारे में जानकारी के कुछ एसएलओसी शामिल नहीं हैं। हालांकि, लेखक नोट करते हैं कि कई एमटीए इसके बजाय RFC2047 का उपयोग करते हैं। आपके उपयोगकेस के आधार पर, यह भी एक मुद्दा हो सकता है।

कुछ उदाहरणों से निर्णय लेना मुझे लगता है कि email.util का उपयोग करके पार्सिंग का अपना तरीका मानना ​​एकमात्र तरीका है, भले ही लंबी सूची समझ कुछ बदसूरत हो।

कुछ सम्मानों में उदाहरणों की कमी के कारण एक नया आरएफसी 2231 पार्सर लिखना बुद्धिमान हो सकता है (यदि आपको वास्तव में बेहतर, शायद तेज़ या अधिक सुंदर कोडबेस चाहिए)। एक नया कार्यान्वयन Dovecot RFC2231 parser जैसे संगतता कारणों के लिए मौजूदा कार्यान्वयन पर आधारित हो सकता है (आप Dovecot unit test का भी उपयोग कर सकते हैं। चूंकि सी कोड मेरे लिए काफी जटिल लगता है और चूंकि मुझे email.util और email.util के पायथन 2 बैकपोर्ट के अलावा कोई पायथन कार्यान्वयन नहीं मिल रहा है। अजगर को पोर्टिंग आसान नहीं होगा का कार्य (ध्यान दें कि Dovecot LGPL-licensed है, जो अपनी परियोजना में कोई समस्या हो सकती है)

मैं email.util RFC2231 एपीआई आसान स्टैंडअलोन उपयोग के लिए, लेकिन अधिक के ढेर के रूप में तैयार नहीं किया गया है लगता है email.message.Message में उपयोग के लिए उपयोगिता विधियों।

0

पुराना सवाल, लेकिन मुझे पूरा जवाब नहीं मिल सका जो इस पर काम करता है।

def decode_rfc2231_header(header): 
    """Decode a RFC 2231 header""" 
    # Remove any quotes 
    header = email.utils.unquote(header) 
    encoding, language, value = email.utils.decode_rfc2231(header) 
    value = urllib.unquote(value) 
    return email.utils.collapse_rfc2231_value((encoding, language, value)) 

उदाहरण के लिए:: यह है कि क्या मैं (अजगर 2.7 पर) कर समाप्त हो गया है

>>> name = u'èéêëēėęûüùúūàáâäæãåāāîïíīįì test ôöòóœøōõssśšłžźżçćčñń' 
>>> encoded_header = email.utils.encode_rfc2231(name.encode("utf8"), 'utf8', 'en') 
>>> print encoded_header 
utf8'en'%C3%A8%C3%A9%C3%AA%C3%AB%C4%93%C4%97%C4%99%C3%BB%C3%BC%C3%B9%C3%BA%C5%AB%C3%A0%C3%A1%C3%A2%C3%A4%C3%A6%C3%A3%C3%A5%C4%81%C4%81%C3%AE%C3%AF%C3%AD%C4%AB%C4%AF%C3%AC%20test%20%C3%B4%C3%B6%C3%B2%C3%B3%C5%93%C3%B8%C5%8D%C3%B5ss%C5%9B%C5%A1%C5%82%C5%BE%C5%BA%C5%BC%C3%A7%C4%87%C4%8D%C3%B1%C5%84 
>>> print decode_rfc2231_header(encoded_header) 
èéêëēėęûüùúūàáâäæãåāāîïíīįì test ôöòóœøōõssśšłžźżçćčñń 
संबंधित मुद्दे