2010-02-23 15 views
6

मैं (अभी केवल चीनी कांजी या जापानी कांजी/हीरागाना/काटाकना मान) मिश्रित एशियाई वर्णों की स्ट्रिंग लेने की जरूरत और "अक्षरांकीय" का मिश्रण भरोसा कर सकते हैं (यानी , Enlgish, फ्रेंच), और यह निम्नलिखित तरीके से गिनती:जावास्क्रिप्ट का उपयोग करते हुए, मैं कैसे एशियाई वर्ण और अंग्रेज़ी शब्द

1) 1 के रूप में प्रत्येक एशियाई वर्णों की संख्या; 2) प्रत्येक अल्फान्यूमेरिक शब्द को 1 के रूप में गिनें;

कुछ उदाहरण:

株式会社 mycompany = 4 वर्ण + 1 शब्द = 5 कुल 株式会社 マ イ コ = 7 वर्ण


अपने ही विचार अब तक उपयोग करने के लिए है:

var wordArray=val.split(/\w+/); 

और उसके बाद प्रत्येक तत्व की जांच देखने के लिए कि उसकी सामग्री अक्षरांकीय नहीं (ताकि 1 के रूप में गिनती) या कर रहे हैं (ताकि सरणी लंबाई लेने के लिए)। लेकिन मुझे नहीं लगता कि यह वास्तव में बहुत चालाक है और जिस पाठ की गणना की जा रही है वह 10,000 शब्द तक हो सकती है, इसलिए बहुत तेज़ नहीं।

विचार?

+0

आप अन्य मल्टीबाइट वर्णों से एशियाई चरित्र नहीं बता सकते हैं। – shinkou

+2

निश्चित रूप से आप कर सकते हैं। उनके पास अलग-अलग मूल्य हैं। – Annabelle

+1

धन्यवाद, हर कोई। हम वास्तव में इस पर बस गए: var charArray = val.match (/ \ w + | [^।, \ UFF10- \ uFF19, \ uFF9E, \ uFF9F]/g); अलर्ट (charArray.length); हम एशियाई शब्दों की गिनती में रूचि नहीं रखते थे, हमें वर्णों की संख्या और अल्फान्यूमेरिक शब्दों की गिनती की आवश्यकता थी। मुझे कुछ बहिष्कृत कोड जोड़ने की आवश्यकता होगी, मुझे लगता है, लेकिन यह एक अच्छी शुरुआत है। – user224513

उत्तर

-2

मैं पिछले बजट से लगता है कि आप सभी पात्रों से अधिक लूप करना चाहते हैं, और (अपनी परिभाषा के अनुसार) एक काउंटर हर बार वर्तमान चरित्र एक अलग शब्द में है वृद्धि हुई है।

-1

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

मेरी कार्यान्वयन पर कुछ नोट:

  1. यह शायद उच्चारण वर्ण सही ढंग से संभाल नहीं है। वे शायद शब्द ब्रेक ट्रिगर करेंगे। इसे ठीक करने के लिए आप wordBreakRegEx को संशोधित कर सकते हैं।

  2. cjkRegEx में कुछ अधिक गूढ़ कोड बिंदु श्रेणियां शामिल नहीं हैं, क्योंकि उन्हें संदर्भ में 5 हेक्स अंकों की आवश्यकता होती है और जावास्क्रिप्ट के रेगेक्स इंजन आपको ऐसा करने की प्रतीत नहीं करते हैं। लेकिन आपको शायद इनके बारे में चिंता करने की आवश्यकता नहीं है, क्योंकि मुझे यह भी नहीं लगता कि अधिकांश फोंट में उन्हें शामिल किया गया है।

  3. मैंने जानबूझकर जापानी हिरगाना और कटकाण को cjkRegEx से बाहर छोड़ा, क्योंकि मुझे यकीन नहीं है कि आप इन्हें कैसे संभालना चाहते हैं। जिस पाठ के साथ आप काम कर रहे हैं उसके आधार पर, यह एक शब्द के रूप में उनके तारों के इलाज के लिए और अधिक समझ सकता है। उस स्थिति में, आपको "अल्फान्यूमेरिक शब्द" बनाम "काना शब्द" बनाम पहचानने के लिए तर्क जोड़ने की आवश्यकता होगी। यदि आपको परवाह नहीं है, तो आपको बस अपनी कोड बिंदु श्रेणियों को cjkRegEx में जोड़ना होगा। बेशक, आप काना तारों के भीतर शब्द ब्रेक को पहचानने की कोशिश कर सकते हैं, लेकिन यह जल्दी से बहुत मुश्किल हो जाता है।

उदाहरण कार्यान्वयन:

function getWordCount(text) { 
    // This matches all CJK ideographs. 
    var cjkRegEx = /[\u3400-\u4db5\u4e00-\u9fa5\uf900-\ufa2d]/; 

    // This matches all characters that "break up" words. 
    var wordBreakRegEx = /\W/; 

    var wordCount = 0; 
    var inWord = false; 
    var length = text.length; 
    for (var i = 0; i < length; i++) { 
    var curChar = text.charAt(i); 
    if (cjkRegEx.test(curChar)) { 
     // Character is a CJK ideograph. 
     // Count it as a word. 
     wordCount += inWord ? 2 : 1; 
     inWord = false; 
    } else if (wordBreakRegEx.test(curChar)) { 
     // Character is a "word-breaking" character. 
     // If a word was started, increment the word count. 
     if (inWord) { 
     wordCount += 1; 
     inWord = false; 
    } else { 
     // All other characters are "word" characters. 
     // Indicate that a word has begun. 
     inWord = true; 
    } 
    } 

    // If the text ended while in a word, make sure to count it. 
    if (inWord) { 
    wordCount += 1; 
    } 

    return wordCount; 
} 

Unihan Database यूनिकोड में CJK के बारे में सीखने के लिए बहुत उपयोगी है। इसके अलावा Unicode home page में जानकारी की बहुत सारी जानकारी है।

+0

उदाहरण छद्म कोड के अलावा बहुत उपयोगी नहीं है। 1) उदाहरण कार्यान्वयन में लूप के अंत में एक बंद ब्रैकेट गुम है, इसे पूरी तरह से तोड़ रहा है। 2) यदि आप इसे ठीक करते हैं, तो यह अंग्रेजी शब्दों को सही नहीं मानता है। 3) यह जापानी शब्दों को सही नहीं मानता क्योंकि लेखक ने हिरगाना और कटकाण को छोड़ दिया था। – fotoflo

3

दुर्भाग्य से जावास्क्रिप्ट RegExp में यूनिकोड चरित्र वर्गों के लिए कोई समर्थन नहीं है; \w केवल ASCII वर्णों पर लागू होता है (मॉड्यूल कुछ ब्राउज़र कीड़े)।

आप समूहों में यूनिकोड वर्णों का उपयोग कर सकते हैं, हालांकि, यदि आप एक श्रेणी के रूप में रुचि रखने वाले पात्रों के प्रत्येक सेट को अलग कर सकते हैं तो आप इसे कर सकते हैं। उदा .:

var r= new RegExp(
    '[A-Za-z0-9_\]+|'+        // ASCII letters (no accents) 
    '[\u3040-\u309F]+|'+       // Hiragana 
    '[\u30A0-\u30FF]+|'+       // Katakana 
    '[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF]', // Single CJK ideographs 
'g'); 

var nwords= str.match(r).length; 

(यह एक शब्द के रूप में काना का एक प्रकार से प्रत्येक रन गिनती, जापानी के लिए 'शब्द' का एक और अधिक यथार्थवादी गिनती देने के लिए प्रयास करता है। यही कारण है कि अभी भी है, है ना निश्चित रूप से नहीं है, लेकिन यह शायद करीब है प्रत्येक शब्द को एक शब्द के रूप में इलाज करने से।)

स्पष्ट रूप से ऐसे कई और पात्र हैं जिन्हें आप 'ठीक से करना चाहते हैं' के लिए जिम्मेदार होना होगा। आइए उम्मीद करते हैं कि आपके पास मूल बहुभाषी विमान के बाहर वर्ण नहीं हैं, एक के लिए!