2015-09-24 9 views
7

मैं यह निर्धारित करने के लिए आने वाली स्ट्रिंग को पार्स करने की कोशिश कर रहा हूं कि इसमें कोई गैर-इमोजिस है या नहीं।नोड.जेएस इमोजी पार्सिंग

मैं this great article by Mathias से गुजर चुका हूं और रेगेक्स पीढ़ी के लिए एन्कोडिंग/डिकोडिंग और regenerate दोनों देशी punycode का लाभ उठा रहा हूं। मैं इमोजिस का अपना शब्दकोश प्राप्त करने के लिए EmojiData का भी उपयोग कर रहा हूं।

उन सभी के साथ, कुछ इमोजी कमजोर छोटे बगर्स बने रहते हैं और मैच से इनकार करते हैं। कुछ इमोजी के लिए, मुझे कोड पॉइंट की एक जोड़ी मिलती रहती है।

// Example of a single code point: 
console.log(punycode.ucs2.decode('')); 
>> [ 128169 ] 

// Example of a paired code point: 
console.log(punycode.ucs2.decode('⌛️')); 
>> [ 8987, 65039 ] 

मैथियास अपने लेख में इस पर छू लेती है (और इस के आसपास काम कर पनीकोड ​​का एक उदाहरण देता है), लेकिन यहां तक ​​कि उनके उदाहरण का उपयोग मैं एक गलत प्रतिक्रिया मिल:

function countSymbols(string) { 
    return punycode.ucs2.decode(string).length; 
} 
console.log(countSymbols('')); 
>> 1 
console.log(countSymbols('⌛️')); 
>> 2 

क्या पता लगाने के लिए सबसे अच्छा तरीका है क्या एक स्ट्रिंग में सभी इमोजी हैं या नहीं? यह अवधारणा के सबूत के लिए है, इसलिए समाधान आवश्यकतानुसार क्रूर बल के रूप में हो सकता है।

--- अद्यतन ---

ऊपर मेरी परेशान इमोजी पर एक छोटे से अधिक संदर्भ।

⌛ // \u231b 

⌛️ // \u231b\ufe0f 

पहले एक अच्छा काम करता है, दूसरा नहीं करता है:

ये नेत्रहीन समान लेकिन वास्तव में अलग यूनिकोड मूल्यों (दूसरा एक ऊपर के उदाहरण से है) कर रहे हैं। दुर्भाग्यवश, दूसरा संस्करण आईओएस का उपयोग करने के लिए लगता है (यदि आप iMessage से कॉपी और पेस्ट करते हैं तो आपको दूसरा मिलता है, और जब ट्विलियो से टेक्स्ट प्राप्त होता है, तो वही बात)।

+0

तो यह लगता है कि संयोजन के निशान (दूसरा उदाहरण पर यूनिकोड की है कि अतिरिक्त बिट) क्या ट्रिपिंग है कर रहे हैं यहाँ चीजें। मैं अपनी स्ट्रिंग से इन तत्वों से छुटकारा पाने के तरीके में देख रहा हूं। – thekevinscott

+0

यदि कोई भी कभी भी इसी तरह के उपयोग के मामले में चलता है, तो मैंने इसे सब एक एनपीएम मॉड्यूल में पैक किया: https://github.com/scottlabs/emojiExists – thekevinscott

उत्तर

3

U+FE0F एक संयोजन चिह्न नहीं है, यह एक भिन्नता अनुक्रम है जो ग्लिफ के प्रतिपादन को नियंत्रित करता है (this answer देखें)। ऐसे अनुक्रमों को हटाने से चरित्र की उपस्थिति बदल सकती है, उदाहरण के लिए: U+231B + U+FE0E (⌛︎)।

इसके अलावा, इमोजी अनुक्रम एकाधिक कोड बिंदुओं से बनाये जा सकते हैं। उदाहरण के लिए, U+0032 (2) अपने आप में एक इमोजी नहीं है, लेकिन U+0032 + U+20E3 (2⃣) या U+0032 + U+20E3 + U+FE0F (2⃣️) है-लेकिन U+0041 + U+20E3 (A⃣) नहीं है। यूनिकोड कंसोर्टियम द्वारा emoji-data.txt फ़ाइल में इमोजी अनुक्रमों की एक पूरी सूची बनाए रखी जाती है (emoji-data-js लाइब्रेरी में यह जानकारी दिखाई देती है)।

यह जांचने के लिए कि किसी स्ट्रिंग में इमोजी वर्ण हैं या नहीं, आपको यह जांचने की आवश्यकता होगी कि कोई भी वर्ण emoji-data.txt में है या इसमें अनुक्रम के लिए एक सबस्ट्रिंग प्रारंभ होता है।

+0

आपकी सहायता के लिए धन्यवाद। अब मैं सबसे पहले कोड पॉइंट के जोड़े की तलाश कर रहा हूं, इसके बाद व्यक्तिगत कोड पॉइंट्स और मेरे उपयोग के मामले में काम कर रहा हूं। – thekevinscott

0

मैंने रुचि रखने वालों के लिए deep dive on handling emojis in Javascript लिखा था। स्वीकृत उत्तर अभी भी मेरे प्रश्न के जवाब में सबसे मान्य है।

0

यदि, अनुमानतः, आप जानते हैं कि गैर-इमोजी पात्रों में आप किस भाग में भाग लेने की उम्मीद करते हैं, तो आप उनके लॉयरैश जादू का उपयोग अपने एरे या स्प्लिट मॉड्यूल के माध्यम से कर सकते हैं, जो इमोजी जानते हैं।उदाहरण के लिए, यदि आप देखने के लिए अगर एक स्ट्रिंग अक्षरांकीय अक्षर शामिल हैं चाहते हैं, आप एक समारोह इतना लिख ​​सकते हैं:

function containsAlphaNumeric(string){ 
return _(string).toArray().filter(function(char){ 
    return char.match(/[a-zA-Z0-9]/); 
}).value().length > 0 ? true : false; 
}