2009-07-30 16 views
7

मैं एक सिनात्रा आवेदन (http://analyzethis.espace-technologies.com) है जो निम्नरूबी 1.9.1 में एक निश्चित एन्कोडिंग के लिए नेट :: HTTP प्रतिक्रिया को कैसे परिवर्तित करें?

  1. करता है एक HTML पृष्ठ को पुनः प्राप्त (शुद्ध के माध्यम से/http)
  2. response.body
  3. से एक Nokogiri दस्तावेज़ बनाएँ कुछ जानकारी निकालें और भेजने के लिए प्रतिक्रिया में वापस। प्रतिक्रिया यूटीएफ -8 एन्कोडेड

तो मैं उन साइटों को पढ़ने की कोशिश करते समय समस्या आई, जो विंडोज़-1256 एन्कोडिंग जैसे www.filfan.com या www.masrawy.com का उपयोग करते हैं।

समस्या यह है कि एन्कोडिंग रूपांतरण का परिणाम सही नहीं है हालांकि कोई त्रुटि नहीं फेंक दी गई है।

शुद्ध/http response.body.encoding देता ASCII-8bit जो करने के लिए परिवर्तित नहीं किया जा सकता UTF-8

मैं Nokogiri :: एचटीएमएल (response.body) और सीएसएस चयनकर्ताओं का उपयोग कुछ पाने के लिए करते हैं पृष्ठ से सामग्री - उदाहरण के लिए शीर्षक टैग की सामग्री कहें - मुझे एक स्ट्रिंग मिलती है, जब मैं स्ट्रिंग.नकोडिंग को कॉल करता हूं विन्डोज़-1256। मैं string.encode ("utf-8") का उपयोग करता हूं और इसका उपयोग करके प्रतिक्रिया भेजता हूं लेकिन फिर प्रतिक्रिया सही नहीं होती है।

मेरे दृष्टिकोण में क्या गलत है इसके बारे में कोई सुझाव या विचार?

उत्तर

3

मैं अब

def document 
    if @document.nil? && response 
    @document = if document_encoding 
        Nokogiri::HTML(response.body.force_encoding(document_encoding).encode('utf-8'),nil, 'utf-8') 
       else 
        Nokogiri::HTML(response.body) 
       end 
    end 
    @document 
end 

def document_encoding 
    return @document_encoding if @document_encoding 
    response.type_params.each_pair do |k,v| 
    @document_encoding = v.upcase if k =~ /charset/i 
    end 
    unless @document_encoding 
    #document.css("meta[http-equiv=Content-Type]").each do |n| 
    # attr = n.get_attribute("content") 
    # @document_encoding = attr.slice(/charset=[a-z1-9\-_]+/i).split("=")[1].upcase if attr 
    #end 
    @document_encoding = response.body =~ /<meta[^>]*HTTP-EQUIV=["']Content-Type["'][^>]*content=["'](.*)["']/i && $1 =~ /charset=(.+)/i && $1.upcase 
    end 
    @document_encoding 
end 
+0

यह बहुत अच्छा काम करता है! –

20

मेरे लिए काम क्योंकि Net :: HTTP सही ढंग से एन्कोडिंग संभाल नहीं करता है निम्नलिखित कोड मिला। http://bugs.ruby-lang.org/issues/2567

आप response['content-type'] को पार्स कर सकते हैं जिसमें पूरे response.body को पार्स करने की बजाय वर्णमाला शामिल है।

फिर सही एन्कोडिंग सेट करने के लिए force_encoding() का उपयोग करें।

response.body.force_encoding("UTF-8") यदि साइट यूटीएफ -8 में सेवा दी जाती है।

+0

हालांकि यह समाधान काम करता है, यह समस्या केवल कुछ साइटों के लिए मेरे साथ हुई। शायद जब सामग्री-प्रकार में 'एप्लिकेशन/जेसन' शामिल है, तो यह यूटीएफ -8 में एन्कोड करता है ...? Http://stackoverflow.com/questions/9254891/what-does-content-type-application-json-charset-utf-8-really-mean के अनुसार, एप्लिकेशन/जेसन यूटीएफ -8 का तात्पर्य है। –

+1

अगला लॉजिकल चरण परिणामी स्ट्रिंग पर .encode! ('UTF-8') को कॉल करना होगा और फिर वास्तविक प्रसंस्करण –

+0

@DmitryVyal आपने अपना दिन साथी बचा लिया है – JustMichael