2012-10-12 23 views
6

के बीच स्ट्रिंग की लंबाई अंतर मैं एक वेबसाइट thats रूबी 1.8.7 पर चल रहे हैं। मेरे पास आने वाली पोस्ट पर एक सत्यापन है जो यह सुनिश्चित करने के लिए जांच करता है कि हम अधिकतम 12000 वर्णों की अनुमति देते हैं। रिक्त स्थान को वर्ण और टैब के रूप में गिना जाता है और पद को सत्यापन के अधीन होने से पहले कैरिज रिटर्न हटा दिया जाता है।रूबी 1.8 और 1.9

यहाँ पोस्ट कि सत्यापन http://pastie.org/5047582

के अधीन है माणिक 1.9 में स्ट्रिंग की लंबाई 11,909 जो सही है के रूप में दिखाई है। लेकिन जब मैं रूबी 1.8.7 पर लंबाई की जांच करता हूं तो 12044 हो जाता है।

मैंने इस रूबी कोड को चलाने के लिए codepad.org का उपयोग किया जो मुझे http://codepad.org/OxgSuKGZ (जो लंबाई 12044 के रूप में आउटपुट करता है जो गलत है) लेकिन जब मैं स्ट्रिंग लंबाई codeacademy.org पर कंसोल में इस एक ही कोड चलाने 11909.

किसी को भी मुझे क्यों यह हो रहा है की व्याख्या कर सकते है ???

धन्यवाद

उत्तर

11

यह एक यूनिकोड मुद्दा है। जिस स्ट्रिंग का आप उपयोग कर रहे हैं वह ASCII रेंज के बाहर वर्ण हैं, और यूटीएफ -8 एन्कोडिंग जिसे अक्सर 2 (या अधिक) बाइट्स के रूप में एन्कोड किया जाता है।

"ą".length 
=> 2 

रूबी 1.9 बेहतर यूनिकोड हैंडलिंग है:

रूबी 1.8 यूनिकोड ठीक से संभाल नहीं था, और length बस स्ट्रिंग में बाइट्स है, जो की मज़ेदार बातों में जो परिणाम की संख्या देता है।

"ä".length 
=> 1 

एक रूबी 1.8 नियमित अभिव्यक्ति उपयोग कर रहा है में संभावित समाधान है, जो यूनिकोड बारे में पता किया जा सकता है::

यह length स्ट्रिंग में पात्रों की वास्तविक संख्या लौटने, जब तक कि रूबी एन्कोडिंग जानता शामिल
"ą".scan(/./mu).size 
=> 1 
+0

जवाब देना के लिए धन्यवाद। लेकिन अगर आप ध्यान से pastie में स्ट्रिंग की जाँच तुम वहाँ आप वर्ण जो बजाय पात्रों बाइट्स पर की जाती है की सूची है post.Do में कोई यूनिकोड वर्ण हैं कि देखेंगे ?? – Raghu

+1

रहे हैं - उदाहरण के लिए उद्धरण नहीं कर रहे हैं '" 'चरित्र है, लेकिन अलग बाईं उद्धरण और सही उद्धरण वर्ण, जो ASCII नहीं हैं –

+0

ठीक धन्यवाद कि समझ में आता है – Raghu

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