2012-01-17 13 views
7

मैं रेल 3.0.3 का उपयोग कर रहा REE (रूबी 1.8.7) और मणि 'mysql2' के साथ, '0.2.6'unescape विशेष रेल में URL से सही ढंग से पात्रों 3.0.3

एक खोज सुविधा नहीं है मेरी परियोजना में जो लोगों को यूआरएल का उपयोग करके या फॉर्म का उपयोग करके जीईटी विधि का उपयोग करने में सक्षम बनाता है और फिर यूआरएल उत्पन्न करता है। एक "Asunción, पैराग्वे"

वे दोनों है:

उदाहरण:

मैं खोज करना चाहते हैं:

मूल शहर: "Århus, डेनमार्क" और गंतव्य शहर विशेष वर्ण: "Å" और " ó", इसलिए यूआरएल जब कोई इस तरह उत्पन्न हो जाएगा खोज बटन पर क्लिक करें।

?&origin=%C5rhus%2C%20Denmark&destination=Asunci%F3n%2C%20Paraguay 

समस्या:

जब मैं खोज शहर है कि, यह नहीं छोड़ा जाएगा नहीं कर रहा है जैसे मैं चाहता हूँ (मैं सीजीआई, यूआरआई की तरह उपयोग करने की कोशिश, यहां तक ​​कि कुछ जवाहरात)।

जब मैं कंसोल पर देखते हैं, ActiveRecord इस तरह क्वेरी प्राप्त किया:

Parameters: {"destination"=>"Asunci�n, Paraguay", "origin"=>"�rhus, Denmark", "sort"=>"newest"} 
City Load (0.1ms) SELECT `cities`.* FROM `cities` WHERE (`cities`.`name` = '�rhus') ORDER BY cities.name ASC 
City Load (6.8ms) SELECT `cities`.* FROM `cities` WHERE (`cities`.`name` = 'Asunci�n, Paraguay') ORDER BY cities.name ASC 

निष्कर्ष: शहर नहीं मिला नहीं किया जा सकता :(

लेकिन, मैं एक दिलचस्प बात पाया:

  • जब मैं इस समारोह के साथ asociated फाइल पर कोई त्रुटि की, उत्पादन इस तरह होगा:

    अनुरोध

    Parameters: 
    {"destination"=>"Asunción, 
    Paraguay", 
    "origin"=>"Århus, 
    Denmark", 
    "sort"=>"newest"} 
    

यह एक वैध एक है!

प्रश्न:

तुम लोग एक विचार यह कैसे हल करने के लिए है? अग्रिम धन्यवाद :)

उत्तर

11

आप सही हैं, ऐसा लगता है कि आपके पास कहीं एन्कोडिंग समस्या है। यूटीएफ -8 में 0xC5 वर्ण ISO-8859-1 (AKA Latin-1) में "Å" है, यह URL में %C3%85 होगा।

मुझे संदेह है कि आप क्लाइंट पक्ष पर जावास्क्रिप्ट का उपयोग कर रहे हैं और यह कि आपकी जावास्क्रिप्ट URL बनाने के लिए old escape फ़ंक्शन का उपयोग कर रहा है, escape में गैर-ASCII वर्णों के साथ कुछ समस्याएं हैं। यदि ऐसा है, तो आपको इसके बजाय encodeURIComponent का उपयोग करने के लिए अपनी जावास्क्रिप्ट को अपग्रेड करना चाहिए।इस छोटे से प्रदर्शन पर एक नजर डालें और आप देखेंगे कि मैं क्या बारे में बात कर रहा हूँ:

http://jsfiddle.net/ambiguous/U5A3k/

आप तो क्लाइंट साइड स्क्रिप्ट बदल नहीं सकते तो आप यह मुश्किल कर सकते हैं रूबी में जिस तरह से force_encoding और encoding का उपयोग कर:

>> s = CGI.unescape('%C5rhus%2C%20Denmark') 
=> "\xC5rhus, Denmark" 
>> s.encoding 
=> #<Encoding:UTF-8> 
>> s.force_encoding('iso-8859-1') 
=> "\xC5rhus, Denmark" 
>> s.encoding 
=> #<Encoding:ISO-8859-1> 
>> s.encode!('utf-8') 
=> "Århus, Denmark" 
>> s.encoding 
=> #<Encoding:UTF-8> 

आप params से "\xC5rhus, Denmark" की तरह कुछ मिलना चाहिए और आप unmangle सकता है कि साथ:

s = params[:whatever].force_encoding('iso-8859-1').encode('utf-8') 

सर्वर पक्ष पर इसके साथ काम करना आखिरी उपाय होगा, यदि आपका क्लाइंट-साइड कोड गलत तरीके से एन्कोड किए गए डेटा को वापस भेज रहा है तो आपको पता लगाने के लिए सर्वर पर अनुमान लगाने का ढेर छोड़ा जाएगा एन्कोडिंग वास्तव में यूआरएल में लाने के लिए इस्तेमाल किया गया था।

+0

हाँ! मैंने पहले जावास्क्रिप्ट में यूआरएल बनाने के लिए 'एस्केप' फ़ंक्शन का उपयोग किया था, और अब मैं आपको बताए गए 'एन्कोडुरिकॉम्पोनेंट' का उपयोग कर रहा हूं और यह काम करता है: डी मेरा दिन बचाने के लिए धन्यवाद :) – panggi

संबंधित मुद्दे