2012-05-10 21 views
7

मैं इसे डाउनलोड करने और डाउनलोड करने के लिए फ़ाइल के यूआरएल निकालने के लिए रूबी का उपयोग कर रहा हूं। फ़ाइल नाम में utf8 अक्षर हैं, पूर्व:मैं एएससीआईआईआई अक्षरों के यूआरएल एन्कोडिंग कैसे करूं?

www.domain.com/.../ÖÇÄÜ360ÓïÒôÖúÀí.txt 

उपर्युक्त यूआरएल डाउनलोड करने का प्रयास करते समय, यह विफल हो जाता है। URI::escape का उपयोग करते हुए एक URI पैदा करता है कि यह भी काम नहीं करता:

www.domain.com/.../%C3%96%C3%87%C3%84%C3%9C360%C3%93%C3%AF%C3%92%C3%B4%C3%96%C3%BA%C3%80%C3%AD.txt 

लेकिन अगर मैं URL Encoding Reference का पालन करें, यह काम करता है:

www.domain.com/.../%D6%C7%C4%DC360%D3%EF%D2%F4%D6%FA%C0%ED.txt 

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

मैं JRuby 1.6.2 का उपयोग कर रहा RUBY_VERSION साथ => "1.8.7"

+1

बाइट्स सी 3 9 6 एक यूटीएफ -8-एन्कोडेड ओ है। एएससीआईआई में एक ही बाइट डी 6 के रूप में एक ही चरित्र का प्रतिनिधित्व किया जाता है। इसलिए समस्या का समाधान करने का एक तरीका है अपने यूटीएफ -8 अक्षरों को ASCII में परिवर्तित करना, जहां आप कर सकते हैं, और फिर यूआरआई :: बचें। लेकिन यह यूनिकोड वर्णों के लिए आपकी सहायता नहीं करेगा जिनके पास ASCII समकक्ष नहीं है। –

+0

क्या आपने ['CGI.escape'] (http://ruby-doc.org/stdlib-1.9.3/libdoc/cgi/rdoc/CGI.html#method-c-escape) की कोशिश की है? –

+0

@ डेविड गोरलाइन: यह काम नहीं करता है। मैं '?' के साथ खत्म '360' और '.txt' को छोड़कर सभी पात्रों के लिए। ऊपर दिया गया उदाहरण एक वास्तविक उदाहरण है, अगर आपके पास कोई विचार है तो आप स्ट्रिंग'ÖÇÄÜ360ÓïÒôÖúÀí.txt 'पर उनका परीक्षण कर सकते हैं और मुझे यह बताएं कि यह कैसे करें। आपकी मदद के लिए बहुत बहुत धन्यवाद। – Rami

उत्तर

15

ओह, वर्ण एन्कोडिंग की खुशियों!

यहां क्या हो रहा है इस प्रकार है। रूबी आंतरिक रूप से उस स्ट्रिंग को संग्रहीत कर रहा है जिसे आपने बाइट्स के अनुक्रम के रूप में निकाला है जो फ़ाइल के नाम के यूटीएफ -8 एन्कोडिंग है। जब आप URI.escape पर कॉल करते हैं, तो वे बाइट %xy प्रारूप में भाग गए हैं, और परिणामी स्ट्रिंग, जो अब पूरी तरह से ASCII रेंज में बाइट्स शामिल हैं, को यूआरएल के रूप में उपयोग किया जाता है।

प्राप्त सर्वर हालांकि, उन बाइट्स व्याख्या करने के तरीके के रूप में यदि वे एक अलग एन्कोडिंग में थे इस मामले ISO-8859-1 में, (उनमें %xy रूप से न छोड़ने के बाद), और इसलिए जिसके परिणामस्वरूप फ़ाइल नाम इसे साथ यह कुछ भी मेल नहीं खाती आता है है।

रूबी 1.9 का उपयोग करके यहां एक प्रदर्शन है, क्योंकि इसमें एन्कोडिंग के लिए बेहतर समर्थन है।

1.9.3-p194 :003 > f 
=> "ÖÇÄÜ360ÓïÒôÖúÀí.txt" 
1.9.3-p194 :004 > f.encoding 
=> #<Encoding:UTF-8> 
1.9.3-p194 :005 > URI.escape f 
=> "%C3%96%C3%87%C3%84%C3%9C360%C3%93%C3%AF%C3%92%C3%B4%C3%96%C3%BA%C3%80%C3%AD.txt" 
1.9.3-p194 :006 > g = f.encode 'iso-8859-1' 
=> "\xD6\xC7\xC4\xDC360\xD3\xEF\xD2\xF4\xD6\xFA\xC0\xED.txt" 
1.9.3-p194 :007 > g.encoding 
=> #<Encoding:ISO-8859-1> 
1.9.3-p194 :008 > URI.escape g 
=> "%D6%C7%C4%DC360%D3%EF%D2%F4%D6%FA%C0%ED.txt" 

इस मामले में समाधान यह भागने से पहले ISO-8859-1 के रूप में स्ट्रिंग एन्कोड करने के लिए इसलिए है। आप iconv का उपयोग कर सकते रूबी 1.9 में आप पिछले संस्करणों में के रूप में ऊपर यह है, (मैं यह सोचते हैं रहा हूँ JRuby iconv भी शामिल है, मैं वास्तव में है कि JRuby से परिचित नहीं हूँ):

1.8.7 :001 > f 
=> "\303\226\303\207\303\204\303\234360\303\223\303\257\303\222\303\264\303\226\303\272\303\200\303\255.txt" 
1.8.7 :005 > g = Iconv.conv('iso-8859-1', 'utf-8', f) 
=> "\326\307\304\334360\323\357\322\364\326\372\300\355.txt" 
1.8.7 :006 > URI.escape f 
=> "%C3%96%C3%87%C3%84%C3%9C360%C3%93%C3%AF%C3%92%C3%B4%C3%96%C3%BA%C3%80%C3%AD.txt" 
1.8.7 :007 > URI.escape g 
=> "%D6%C7%C4%DC360%D3%EF%D2%F4%D6%FA%C0%ED.txt" 

ध्यान दें कि सामान्य रूप में आप कर सकते हैं ' किसी भी विशेष एन्कोडिंग का उपयोग कर सर्वर पर निर्भर नहीं है। यह utf-8 का उपयोग करना चाहिए, लेकिन जाहिर है इस मामले में नहीं है।

+0

बहुत बढ़िया, धन्यवाद! – Rami

+0

यह बहुत उपयोगी था कि एन्कोडिंग के बाद मुझे यूआरआई.स्केप के लिए एक सुराग नहीं था। – KnuturO