2011-03-07 13 views
15

मैं, रूबी 1.9.2 का उपयोग कर रहा 3.0.4/3.0.5 रेल और Phusion यात्री 3.0.3/3.0.4। मेरे टेम्पलेट HAML में लिखे गए हैं और मैं MySQL2 मणि ​​का उपयोग कर रहा हूं।ActionView :: खाका :: त्रुटि (असंगत वर्ण एन्कोडिंग: UTF-8 और ASCII-8 बिट)

ActionView::Template::Error (incompatible character encodings: UTF-8 and ASCII-8BIT) 

मेरी Haml टेम्पलेट की पहली पंक्ति है, जो निम्नलिखित कोड है करने के लिए त्रुटि अंक: मैं एक नियंत्रक कार्रवाई है कि जब एक पैरामीटर विशेष वर्ण है, उमलाउट की तरह पारित कर दिया, मुझे निम्न त्रुटि देता है इस पर:

<!DOCTYPE html> 

मेरे समझ है कि इस क्योंकि मैं एक UTF-8 स्ट्रिंग है कि एक ASCII-8bit तार के साथ concatenated किया जा रहा है के कारण होता है, लेकिन मैं के लिए मुझे के जीवन क्या है कि को समझ नहीं सकता ASCII-8BIT स्ट्रिंग है। Haml टेम्पलेट के शीर्ष और गहरे लाल रंग का फ़ाइलों को UTF-8 घोषणा और मैं अभी भी इस त्रुटि मिलती है: मैं जाँच की है कि कार्रवाई में परम UTF-8 का उपयोग कर इनकोड और मैं एक एन्कोडिंग जोड़ लिया है। मेरे application.rb फ़ाइल के रूप में अच्छी तरह से उस में एक config.encoding = "UTF-8" घोषणा की है और UTF-8 में सभी परिणाम निम्नलिखित:

ENV['LANG'] 
__ENCODING__ 
Encoding.default_internal 
Encoding.default_external 

यहाँ किकर है: मैं स्टैंडअलोन यात्री या संकर जाति का प्रयोग पर मेरी मैक OSX स्थानीय स्तर पर इस परिणाम पुन: पेश नहीं कर सकते या तो विकास या उत्पादन में। मैं इसे केवल लिनक्स पर nginx + यात्री चलाने वाले उत्पादन सर्वर पर पुन: पेश कर सकता हूं। मैंने उत्पादन सर्वर के कंसोल में सत्यापित किया है कि उत्तरार्द्ध ने यूटीएफ -8 में सभी परिणामों का भी उल्लेख किया है।

आप इस त्रुटि का अनुभव किया है और आप इसे कैसे हल किया?

उत्तर

12

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

@current_path = request.env['PATH_INFO'] 

जब इस उदाहरण चर Haml टेम्पलेट में छपा था यह एक त्रुटि के कारण होता है क्योंकि स्ट्रिंग UTF-8 के बजाय ASCII-8bit में इनकोडिंग था।

@current_path = request.env['PATH_INFO'].dup.force_encoding(Encoding::UTF_8) 

कौन सा @current_path मजबूर एक दोहराया स्ट्रिंग है जो उचित UTF-8 एन्कोडिंग के लिए मजबूर किया गया था उपयोग करने के लिए: इसे सुलझाने के लिए मैं निम्नलिखित किया था। यह त्रुटि अन्य अनुरोध संबंधित डेटा जैसे request.headers के साथ भी हो सकती है।

+0

एक ही त्रुटि के बाद, मैं सोच रहा हूँ क्यों उत्पादन Nginx/यात्री पर हो रहा है। इसमें एलसी_एएल ठीक से सेट है।हालांकि अनुरोध .env ASCII है। स्थानीय सर्वर पर इसके utf-8k –

+0

ने यात्री https://github.com/phusion/passenger/issues/1328 पर कोई समस्या जोड़ा –

9

Mysql परेशानी ascii का स्रोत हो सकता है। कम से कम इस संभावना को खत्म करने के प्रारंभकर्ता में निम्नलिखित डाल का प्रयास करें:

require 'mysql' 

class Mysql::Result 
    def encode(value, encoding = "utf-8") 
    String === value ? value.force_encoding(encoding) : value 
    end 

    def each_utf8(&block) 
    each_orig do |row| 
     yield row.map {|col| encode(col) } 
    end 
    end 
    alias each_orig each 
    alias each each_utf8 

    def each_hash_utf8(&block) 
    each_hash_orig do |row| 
     row.each {|k, v| row[k] = encode(v) } 
     yield(row) 
    end 
    end 
    alias each_hash_orig each_hash 
    alias each_hash each_hash_utf8 
end 



संपादित

यह मणि mysql2 के लिए लागू नहीं हो सकता है। हालांकि mysql के लिए काम करता है।

+0

मुझे इस समाधान से अवगत है, लेकिन इसका उद्देश्य mysql मणि mysql2 मणि ​​नहीं है। MySQL 2 में यह समस्या नहीं है। साथ ही, मुझे एक ही परिणाम मिलता है चाहे मैं डेटाबेस से पूछताछ कर रहा हूं या नहीं। –

+0

मैं एक ही समस्या में भाग गया। इस मुद्दे को हल किया, धन्यवाद। – Xaqq

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