2010-04-06 18 views
26

में रिक्त स्थान पर गैर-ब्रेकिंग रिक्त स्थानों को कनवर्ट करें मेरे पास ऐसे मामले हैं जहां HTML टेक्स्टरेरा से उपयोगकर्ता द्वारा दर्ज किया गया डेटा या इनपुट कभी-कभी \u00a0 (गैर-ब्रेकिंग रिक्त स्थान) के साथ भेजा जाता है जब utf-8 json के रूप में एन्कोड किया जाता है।रूबी

मेरा मानना ​​है कि फ़ायरफ़ॉक्स में एक बग होने के नाते, क्योंकि मुझे पता है कि उपयोगकर्ता जानबूझकर रिक्त स्थान के बजाय गैर-ब्रेकिंग रिक्त स्थान नहीं डाल रहा है।

रूबी में दो बग भी हैं, जिनमें से एक का उपयोग दूसरे से लड़ने के लिए किया जा सकता है।

किसी भी कारण से \s\u00a0 से मेल नहीं खाता है।

हालांकि [^[:print:]], जो निश्चित रूप से मेल नहीं खाते हैं) और \xC2\xA0 दोनों मेल खाते हैं, लेकिन मैं उन मुद्दों से निपटने के लिए आदर्श तरीकों से कम मानता हूं।

क्या इस मुद्दे को हल करने के लिए अन्य सिफारिशें हैं?

+1

कौन सा रूबी संस्करण? 1.9.2/\ u00a0/मैच में आता है। – steenslag

+0

\ s \ u00a0 \ u00a0 मैचों में 1.9 से मेल नहीं खाता है, लेकिन मुझे यकीन नहीं है कि 1.8 – CoolAJ86

+7

नियम # 1: जब आपको लगता है कि आपको बेहद लोकप्रिय कार्यक्रम में एक बग मिला है, खासकर किसी परीक्षण में और व्यापक रूप से उपयोग किया जाता है, जैसे फ़ायरफ़ॉक्स के टेक्स्टरेरा हैंडलिंग, बहुत चुपचाप और ध्यान से अपने परीक्षण पर जाएं। 100 में से 99 बार समस्या बाड़ के आपके पक्ष में होगी। जब मुझे टेक्स्ट फ़ील्ड में नॉन-ब्रेकिंग रिक्त स्थान दिखाई देते हैं, जहां संभवतः लोग टेक्स्ट पेस्ट करेंगे, तो मुझे माइक्रोसॉफ्ट वर्ड, या एक संपादक को संदेह है जो रिक्त स्थान के लिए   को प्रतिस्थापित करने के लिए सेट है। आप पृष्ठ बनाकर आसानी से अपने सिद्धांत का परीक्षण कर सकते हैं, इसमें एक टेक्स्ट क्षेत्र डाल सकते हैं और समस्या को डुप्लिकेट करने का प्रयास कर सकते हैं। –

उत्तर

1

रूबी (1.8.x) के पुराने संस्करणों के लिए, प्रश्नों में वर्णित फिक्स हैं।

यह रूबी 1.9+ के नए संस्करणों में तय किया गया है।

+0

क्या आप अधिक विशिष्ट प्राप्त कर सकते हैं? मुझे बस 1.9.3p194 पर एक ही समस्या थी जो काफी 1.9ish है। \ n यूनिकोड गैर-ब्रेकिंग स्पेस से मेल नहीं खाता है लेकिन \ u00a0 करता है। – nasmorn

2

किसी भी कारण से \ u00a0 से मेल नहीं खाता है।

मुझे लगता है कि "जो भी कारण" है, वह नहीं माना जाता है। केवल POSIX और \ p निर्माण चरित्र वर्ग यूनिकोड जागरूक हैं। चरित्र स्तरीय संक्षिप्त रूपों नहीं हैं:

Sequence As[...]  Meaning 
    \d [0-9]   ASCII decimal digit character 
    \D [^0-9]   Any character except a digit 
    \h [0-9a-fA-F] Hexadecimal digit character 
    \H [^0-9a-fA-F] Any character except a hex digit 
    \s [ \t\r\n\f] ASCII whitespace character 
    \S [^ \t\r\n\f] Any character except whitespace 
    \w [A-Za-z0-9\_] ASCII word character 
    \W [^A-Za-z0-9\_] Any character except a word character 
+2

ओह, यह ** ** ** ठीक है, ठीक है। यह बस नहीं करता है। मेरा जवाब देखें – tchrist

+0

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

+0

यह चीजों पर वास्तव में एक अजीब लेना है। tchrist बिल्कुल सही है, और कह रहा है कि कुछ "काम नहीं करना चाहिए" क्योंकि यह वर्तमान में काम नहीं करता है, मैं थोड़ी देर में पढ़ा गया सबसे अच्छा खाली सत्य है। किसी भी तरह से - [[: space:]] पर gsub जब तक कोई रूबी वास्तव में मानकों का अनुपालन नहीं करता है। – owenmarshall

6

आप यूनिकोड खाली स्थान के लिए \s का उपयोग नहीं कर सकते हैं, कि, रूबी regex कार्यान्वयन में एक बग है क्योंकि UTS#18 “Unicode Regular Expressions” Annex C on Compatibility Properties एक \s के अनुसार, बिल्कुल किसी भी यूनिकोड खाली स्थान के मैच के लिए आवश्यक है कोड बिंदु

मानक अनुशंसा और पीओएसईक्स संगतता का विवरण देने वाले दो कॉलम \s मामले के लिए समान हैं क्योंकि कोई भी विग्गल-रूम अनुमति नहीं है। आप इसके आस-पास अपना रास्ता दस्तावेज नहीं कर सकते: यदि आप ऐसा नहीं करते हैं, तो आप यूटीएस # 18 के RL1.2a के साथ यूनिकोड मानक के अनुपालन से बाहर हैं।

यदि आप आरएल 1.2 ए को पूरा नहीं करते हैं, तो आप स्तर 1 आवश्यकताओं को पूरा नहीं करते हैं, जो यूनिकोड पर नियमित अभिव्यक्तियों का उपयोग करने के लिए आवश्यक सबसे बुनियादी और प्राथमिक कार्यक्षमता हैं। इसके बिना, आप बहुत ज्यादा खो गए हैं। यही कारण है कि मानक मौजूद हैं। मेरी यादें यह है कि रूबी कई अन्य स्तर 1 आवश्यकताओं को पूरा करने में विफल रहता है। इसलिए आप प्रोग्रामिंग भाषा का उपयोग करना चाहेंगे जो कम से कम स्तर 1 को पूरा करता है यदि आपको वास्तव में नियमित अभिव्यक्तियों के साथ यूनिकोड को संभालने की आवश्यकता होती है।

ध्यान दें कि \p{Whitespace} के लिए खड़े होने के लिए आप \p{Zs} जैसे यूनिकोड सामान्य श्रेणी प्रॉपर्टी का उपयोग नहीं कर सकते हैं। ऐसा इसलिए है क्योंकि व्हाइटस्पेस संपत्ति एक व्युत्पन्न संपत्ति है, न कि सामान्य श्रेणी। इसके अलावा नियंत्रण वर्ण भी शामिल हैं, न केवल विभाजक।

2

वास्तविक कामकाज आईआरबी कोड उदाहरण है कि इस सवाल का जवाब, नवीनतम माणिक के साथ (मई 2012)

रूबी 1।9

require 'rubygems' 
require 'nokogiri' 
RUBY_DESCRIPTION # => "ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]" 
doc = '<html><body> &nbsp; </body></html>' 
page = Nokogiri::HTML(doc) 
s = page.inner_text 
s.each_codepoint {|c| print c, ' ' } #=> 32 160 32 
s.strip.each_codepoint {|c| print c, ' ' } #=> 160 
s.gsub(/\s+/,'').each_codepoint {|c| print c, ' ' } #=> 160 
s.gsub(/\u00A0/,'').strip.empty? #true 

रूबी 1,8

require 'rubygems' 
require 'nokogiri' 
RUBY_DESCRIPTION # => "ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]" 
doc = '<html><body> &nbsp; </body></html>' 
page = Nokogiri::HTML(doc) 
s = page.inner_text # " \302\240 " 
s.gsub(/\s+/,'') # "\302\240" 
s.gsub(/\302\240/,'').strip.empty? #true 
37

उपयोग /\u00a0/ गैर तोड़ने रिक्त स्थान मैच के लिए। उदाहरण के लिए s.gsub(/\u00a0/, ' ') सभी गैर-ब्रेकिंग रिक्त स्थान नियमित स्थानों पर परिवर्तित करता है।

सभी सफेद जगहों से मेल खाने के लिए /[[:space:]]/ का उपयोग करें, जिसमें यूनिकोड व्हाइटस्पेस गैर-ब्रेकिंग रिक्त स्थान शामिल हैं। यह /\s/ के विपरीत है, जो केवल ASCII व्हाइटस्पेस से मेल खाता है।

यह भी देखें: Ruby Regexp documentation

+0

http://www.unicode.org/versions/Unicode6.2.0/ch06.pdf - स्पेस वर्णों को देखें। लेकिन आईडी अधूरा दिखती है –

+0

बस [[[: space]] 'का उपयोग करने के लिए मेरा उत्तर तय करें (स्वयं को नोट करें: नहीं '[: space]')। –

+0

"s.gsub (/ \ u00a0 /, '' ')" जो मैं ढूंढ रहा हूं। –

1

रूबी के लिए (सीधे नहीं और इस सवाल का) संबंधित नहीं है, समस्या के मुख्य हो सकता है कि Alt + अंतरिक्ष Macs पर एक नॉन-ब्रेकिंग का उत्पादन अंतरिक्ष।

यह सभी प्रकार के अजीब व्यवहार (विशेष रूप से टर्मिनल में) का कारण बन सकता है।

उन लोगों के लिए जो अधिक जानकारी में रूचि रखते हैं, मैंने कुछ समय पहले इस विषय के बारे में "Why chaining commands with pipes in Mac OS X does not always work" लिखा था।