2010-11-29 11 views
10

मुझे एक स्ट्रिंग को विभाजित करने और व्हाइटस्पेस वर्णों से अलग शब्दों को निकालने की आवश्यकता है। स्रोत अंग्रेजी या जापानी में हो सकता है। अंग्रेजी सफेद जगहों के पात्रों में टैब और स्थान शामिल है, और जापानी पाठ भी इनका उपयोग करता है। (आईआईआरसी, सभी व्यापक रूप से उपयोग किए जाने वाले जापानी चरित्र सेट यूएस-एएससीआईआईआई के सुपरसेट हैं।)सभी जापानी व्हाइटस्पेस पात्र क्या हैं?

तो मेरी स्ट्रिंग को विभाजित करने के लिए उपयोग करने वाले अक्षरों का सेट सामान्य ASCII स्पेस और टैब शामिल है।

लेकिन, जापानी में, वहाँ एक और अंतरिक्ष चरित्र, जिसे आम तौर पर 'पूर्ण-चौड़ाई अंतरिक्ष' कहा जाता है। मेरे मैक कैरेक्टर व्यूअर यूटिलिटी के मुताबिक, यह यू + 3000 "आइडियोग्राफिक स्पेस" है। यह (आमतौर पर) परिणाम देता है जब कोई उपयोगकर्ता जापानी इनपुट मोड टाइप करते समय स्पेस बार दबाता है।

क्या कोई अन्य पात्र हैं जिन पर मुझे विचार करने की आवश्यकता है?

मैं उपयोगकर्ताओं को, जो "रिक्त स्थान के साथ अलग-अलग प्रविष्टियों" करने के लिए कहा गया है द्वारा प्रस्तुत शाब्दिक डेटा संसाधित कर रहा हूँ। हालांकि, उपयोगकर्ता इन ग्रंथों को सबमिट करने के लिए विभिन्न प्रकार के कंप्यूटर और मोबाइल फोन ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं। हमने पहले ही देखा है कि इस डेटा को दर्ज करते समय उपयोगकर्ताओं को पता नहीं हो सकता है कि वे जापानी या अंग्रेजी इनपुट मोड में हैं या नहीं।

इसके अलावा, अंतरिक्ष कुंजी के व्यवहार भी जापानी मोड (जैसे, विंडोज 7 एक आइडियोग्राफ़िक स्पेस डाल देगा लेकिन आईओएस एक ASCII अंतरिक्ष से जोड़ दिया जाएगा) में प्लेटफार्मों और अनुप्रयोगों भर में अलग है।

तो मैं जो चाहता हूं वह मूल रूप से "सभी अक्षरों का सेट है जो दृष्टि से एक स्थान की तरह दिखते हैं और जब उपयोगकर्ता स्पेस कुंजी दबाता है, या टैब कुंजी उत्पन्न हो सकता है क्योंकि कई उपयोगकर्ताओं को अंतरिक्ष के बीच अंतर नहीं पता है और एक टैब, जापानी और/या अंग्रेजी में "।

वहाँ इस तरह के एक प्रश्न के लिए किसी भी आधिकारिक जवाब है?

+1

उचित यूनिकोड समर्थन के साथ कोई प्रोग्रामिंग भाषा नहीं होना चाहिए, बस आपको व्हाइटस्पेस पर एक स्ट्रिंग (रेगेक्स का उपयोग करके) विभाजित करने दें? उदाहरण के लिए - '/ \ s /' जावास्क्रिप्ट में व्हाईटस्पेस वर्णों से मिलान करता है ('[\ f \ n \ r \ t \ v \ u00A0 \ u2028 \ u2029]' के समतुल्य)। –

+3

मैट: आपके द्वारा उद्धृत रेगेक्स पहले से ही '\ u3000' गायब है और ओपी सोच रहा है कि और क्या गुम हो सकता है। यूनिकोड विभाजक अंतरिक्ष सूची में 18 प्रविष्टियां हैं: http://www.fileformat.info/info/unicode/category/Zs/list.htm – Gabe

+1

मैट: हाँ, मेरी इच्छा है, लेकिन धारणा है कि जावास्क्रिप्ट (और आश्चर्यजनक रूप से, रूबी भी) जेनेरिक 'व्हाइटस्पेस' का गठन करने के बारे में क्या है जापानी व्हाइटस्पेस चरित्र (एस?) शामिल नहीं है। गेबे: उस लिंक के लिए धन्यवाद, मेरे यूनिकोड व्यूअर में मैन्युअल रूप से चारों ओर घूमते हुए मैंने ईएम स्पेस, फिगर स्पेस और दोस्तों में ठोकर खाई थी, लेकिन ओघम स्पेस मार्क या मंगोलियन वाउल SEPARATOR का सामना नहीं किया था ... – Mason

उत्तर

4

आप ASCII टैब, अंतरिक्ष और नॉन-ब्रेकिंग स्पेस (U + 00A0), और पूर्ण-चौड़ाई अंतरिक्ष, जो आपको सही ढंग से U + 3000 के रूप में पहचान की है की जरूरत है। आप संभवतः न्यूलाइन और लंबवत अंतरिक्ष वर्ण चाहते हैं। यदि आपका इनपुट यूनिकोड में है (शिफ्ट-जेआईएस, इत्यादि नहीं) तो आपको इसकी आवश्यकता होगी। अन्य (नियंत्रण) वर्ण हैं जैसे \ 0 NULL जिन्हें कभी-कभी सूचना डिलीमीटर के रूप में उपयोग किया जाता है, लेकिन उन्हें पूर्वी एशियाई पाठ में एक स्थान के रूप में प्रस्तुत नहीं किया जाएगा - यानी, वे सफेद-स्थान के रूप में दिखाई नहीं देंगे।

संपादित करें: मैट गेंद उसकी टिप्पणी में एक अच्छा बिंदु है, लेकिन, के रूप में अपने उदाहरण दिखाता है, कई regex कार्यान्वयन पूर्ण-चौड़ाई पूर्व एशियाई विराम चिह्न के साथ अच्छी तरह से ध्यान नहीं देते हैं। इस संबंध में, यह उल्लेखनीय है कि पायथन का string.whitespace या तो सरसों काट नहीं देगा।

+0

मैं वास्तव में आप पर विश्वास करना चाहता हूं, क्योंकि इसका मतलब है कि मैं कर चुका हूं! :) लेकिन, आप कैसे जानते हो? – Mason

+1

मैं दैनिक आधार पर विभिन्न प्रकार के सिद्धान्तों के पूर्व एशियाई पाठ के साथ काम करता हूं। आप किस पर्यावरण/प्रोग्रामिंग भाषा में हैं? शायद मैं कुछ और विशिष्ट सलाह दे सकता हूं। एक रेगेक्स जो गेबे के लिंक में सबकुछ के साथ काम करता है? – simon

+0

आप सही हैं; जबकि मैट के लिंक में सभी अजीब रिक्त स्थानों के साथ काम करने वाली एक विधि लिखना समाप्त कर दिया, मैंने मैन्युअल रूप से 24 विभिन्न प्लेटफ़ॉर्म/एप्लिकेशन संयोजनों से सबमिट करने का परीक्षण किया। टैब, स्पेस, यू +00 ए 0 और यू + 3000 असली दुनिया में आए थे। तो मैंने आपका जवाब स्वीकार कर लिया। धन्यवाद! – Mason

3

मुझे अभी आपकी पोस्टिंग मिली है। यूनिकोड वर्णों को सामान्य करने के बारे में यह एक महान स्पष्टीकरण है।

http://en.wikipedia.org/wiki/Unicode_equivalence

मैंने पाया कि कई प्रोग्रामिंग भाषाओं, अजगर की तरह, मॉड्यूल को लागू कर सकते हैं कि ये सामान्य यूनिकोड मानकों नियम है। मेरे उद्देश्यों के लिए, मैंने पाया कि निम्नलिखित पायथन कोड बहुत अच्छी तरह से काम करता है। यह एसिसी रेंज में व्हाइटस्पेस के सभी यूनिकोड वेरिएंट को परिवर्तित करता है। सामान्य करने के बाद, एक regex आदेश ascii \ x32 करने के लिए सभी सफेद स्थान परिवर्तित कर सकते हैं: पहला लेखन के बाद से

import unicodedata 
# import re 

ucode = u'大変、 よろしくお願い申し上げます。' 

normalized = unicodedata.normalize('NFKC', ucode) 

# old code 
# utf8text = re.sub('\s+', ' ', normalized).encode('utf-8') 

# new code 
utf8text = ' '.join(normalized.encode('utf-8').split()) 

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

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