2010-07-11 6 views
161

रेल 3 पर रूबी में (वर्तमान में बीटा 4 का उपयोग करके), मुझे लगता है कि form_tag या form_for सहायताकर्ताओं का उपयोग करते समय ☃ (Unicode \ x9731) के मूल्य के साथ _snowman नामक एक छिपी हुई फ़ील्ड है।रूबी में 3snowman पर रूचि में क्या है?

तो, यह क्या है?

+1

यह एक 'प्रलेखन' प्रकार क्यू एंड ए है - मैंने यहां एक जवाब खोजने की कोशिश की और प्रतिबद्ध संदेशों के माध्यम से खुदाई करने की कोशिश की, इसलिए मुझे लगा कि मैं इसे अन्य लोगों के लिए साझा करूंगा जो स्नोमैन के बारे में सोच रहे हैं ... –

+0

यह भी देखें [इस] (http://programmers.stackexchange.com/q/168751/37622)। – MasterMastic

उत्तर

55

यह इंटरनेट   एक्सप्लोरर 5 का समर्थन करने के लिए यहां है और इसके फॉर्म के लिए UTF-8 का उपयोग करने के लिए प्रोत्साहित करता है।

प्रतिबद्ध के रूप में इस संदेश here विवरण यह देखी गई:

फिक्स कई ज्ञात वेब एन्कोडिंग मुद्दों:

  • निर्दिष्ट सभी रूपों पर स्वीकार-चारसेट। सभी हाल ही में ब्राउज़रों, साथ ही IE5 +, प्रपत्र मापदंडों के लिए एन्कोडिंग निर्दिष्ट का उपयोग करेगा
  • दुर्भाग्य से, IE5 + नहीं लग रही होगी पर स्वीकार-चारसेट जब तक फार्म के मूल्यों में कम से कम एक चरित्र पेज के चारसेट में नहीं है। चूंकि उपयोगकर्ता डिफ़ॉल्ट
    चारसेट (जो UTF-8 में सेट रेल) ​​ओवरराइड कर सकते हैं, हम एक छिपा यूनिकोड वर्ण युक्त इनपुट प्रदान करते हैं स्वीकार-चारसेट पर देखो करने के लिए आईई मजबूर।
  • अब वेब इनपुट का विशाल बहुमत यूटीएफ -8 है, हमने यूटीएफ -8 में इनबाउंड पैरामीटर सेट किए हैं। यह ASCII-8BIT और
    यूटीएफ -8 के बीच असंगत एन्कोडिंग के कई मामलों को खत्म करेगा।
  • आप सुरक्षित रूप से परम अनदेखा कर सकते हैं [: _ स्नोमैन]

संक्षेप में, आप सुरक्षित रूप से इस पैरामीटर अनदेखा कर सकते हैं।

फिर भी, मुझे यकीन नहीं है कि हम इंटरनेट   एक्सप्लोरर 5 जैसी पुरानी तकनीकों का समर्थन क्यों कर रहे हैं। यदि आप मुझसे पूछते हैं तो यह रेल के निर्णय पर बहुत ही रूबी जैसा लगता है।

+6

उद्धरण "आईई 5 +" कहता है, तो हो सकता है कि समस्या नए आईई संस्करणों में भी हो? – Philipp

+5

अधिक लंबी प्रतिक्रिया के लिए, कृपया http://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a#commitcomment-118076 (नीचे भी मेरी प्रतिक्रिया देखें) –

292

यह पैरामीटर यूनिकोड के रूप में अपने पैरामीटर को एन्कोड करने के लिए इंटरनेट एक्सप्लोरर (5, 6, 7 और 8) को मजबूर करने के लिए फ़ॉर्म में जोड़ा गया था।

विशेष रूप से, यदि उपयोगकर्ता ब्राउज़र के एन्कोडिंग को लैटिन -1 में स्विच करता है तो यह बग ट्रिगर किया जा सकता है। यह समझने के लिए कि कोई उपयोगकर्ता कुछ पागल क्यों करने का फैसला करेगा, this google search देखें। एक बार उपयोगकर्ता ने वेब साइट को लैटिन -1 मोड में डाल दिया है, अगर वे अक्षरों का उपयोग करते हैं जिन्हें लैटिन -1 और यूनिकोड (उदाहरण के लिए, é या ç, नामों में आम) दोनों के रूप में समझा जा सकता है, तो इंटरनेट एक्सप्लोरर उन्हें लैटिन में एन्कोड करेगा -1।

इसका मतलब है कि यदि कोई उपयोगकर्ता "चे ग्वेरा" की खोज करता है, तो यह सर्वर-साइड पर गलत तरीके से आ जाएगा। रुबी 1.9 में, इसके परिणामस्वरूप एन्कोडिंग त्रुटि होगी जब पाठ अनिवार्य रूप से नियमित अभिव्यक्ति इंजन में अपना रास्ता बना देता है। रूबी 1.8 में, इसका परिणाम उपयोगकर्ता के लिए टूटे हुए परिणाम होंगे।

एक पैरामीटर बनाकर जिसे केवल आईई द्वारा यूनिकोड चरित्र के रूप में समझा जा सकता है, हम आईई को स्वीकार्य-वर्णसेट विशेषता को देखने के लिए मजबूर कर रहे हैं, जो तब इसे सभी वर्णों को यूटीएफ -8 के रूप में एन्कोड करने के लिए कहता है, यहां तक ​​कि जिसे लैटिन -1 में एन्कोड किया जा सकता है।

ध्यान रखें कि रूबी 1.8 में, यह अत्यंत अपने UTF-8 डेटाबेस में लैटिन -1 डेटा प्राप्त करने के तुच्छ है (के बाद से पूरे ढेर की जाँच में कुछ भी नहीं बाइट्स है कि उपयोगकर्ता किसी भी बिंदु पर भेजा मान्य हैं कि यूटीएफ -8 वर्ण)। नतीजतन, यह इस उपयोगकर्ता के सामने वाली बग को प्रदर्शित करने के लिए रूबी अनुप्रयोगों (और PHP अनुप्रयोगों इत्यादि) के लिए बेहद आम है, और इसलिए उपयोगकर्ताओं के लिए एन्कोडिंग को एक उपचारात्मक उपाय के रूप में बदलने की कोशिश करना बेहद आम है।

सभी ने कहा, जब मैंने यह पैच लिखा था, मुझे नहीं पता था कि पैरामीटर का नाम कभी भी उपयोगकर्ता के सामने वाले स्थान में दिखाई देगा (यह उन फॉर्मों के साथ होता है जो जीईटी क्रिया का उपयोग करते हैं, जैसे खोज फ़ॉर्म) । चूंकि यह करता है, हम इस पैरामीटर का नाम _e पर बदल देंगे, और एक अधिक निर्दोष दिखने वाले यूनिकोड चरित्र का उपयोग करेंगे।

+1

पर एक नज़र डालें, यदि यह _method जैसे पारदर्शी पैरामीटर को समाप्त करता है, यह शायद बहुत कम उलझन में होगा। हालांकि, ठीक करने के लिए क्या एक पागल चीज है। – tadman

+1

विस्तृत प्रतिक्रिया के लिए धन्यवाद येहुदा - हालांकि मुझे लगता है कि स्नोमैन को रखने का सबसे अच्छा परिणाम है, शायद यह उन बेवकूफ चीजों में से एक उद्यमों का चयन करेगा - 'यह स्नोमैन चीज़ क्या है?! यह एक व्यवसाय है, एक खेल नहीं! '.. उह। –

+1

@ मैथ्यू, विचित्र रूप से पर्याप्त आप सही हैं। लेकिन मुझे लगता है कि समाधान बहुत प्रभावशाली है। –

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