2012-05-12 16 views
5

मैं अपने PHP कोड में इमोजी का पता लगाने की कोशिश कर रहा हूं, और उपयोगकर्ताओं को इसमें प्रवेश करने से रोकता हूं।php emoji [मौजूदा कोड अपडेट करें]

कोड रहा है:

if(preg_match('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', $value) > 0) 
{ 
    //warning... 
} 

लेकिन सभी इमोजी के लिए काम नहीं करता। कोई विचार?

उत्तर

10
if(preg_match('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', $value) 

आप वास्तव में एक चरित्र के स्तर पर यूनिकोड मिलान करने के लिए है, न कि UTF-8 बाइट दृश्यों का ट्रैक रखने की कोशिश कर रहा से चाहते हैं । अपने यूटीएफ -8 स्ट्रिंग को चरित्र के आधार पर इलाज करने के लिए u संशोधक का उपयोग करें।

इमोजी ब्लॉक U + 1F300-U + 1F5FF में इनकोड। हालांकि:

  • से कई पात्रों जापानी वाहक '' इमोजी 'के सेट वास्तव में मौजूदा यूनिकोड प्रतीकों का उल्लेख किया जाता है, जैसे कार्ड सूट, राशि चक्रों और कुछ तीर। क्या आप इन प्रतीकों को अब 'इमोजी' के रूप में गिनते हैं?

  • अभी भी ऐसे सिस्टम हैं जो निजी उपयोग क्षेत्र में विज्ञापन-प्रसार श्रेणियों का उपयोग करते हुए नए मानकीकृत यूनिकोड इमोजी कोड बिंदुओं का उपयोग नहीं करते हैं। प्रत्येक वाहक के पास अपने स्वयं के एन्कोडिंग होते थे। आईओएस 4 ने सॉफ्टबैंक सेट का इस्तेमाल किया। More info. आप पूरे निजी उपयोग क्षेत्र को अवरुद्ध करना चाहते हैं।

जैसे:।।

function unichr($i) { 
    return iconv('UCS-4LE', 'UTF-8', pack('V', $i)); 
} 

if (preg_match('/['. 
    unichr(0x1F300).'-'.unichr(0x1F5FF). 
    unichr(0xE000).'-'.unichr(0xF8FF). 
']/u'), $value) { 
    ... 
} 
+0

हाय, उस विचार के लिए धन्यवाद, लेकिन यह सब इमोजी के लिए काम नहीं करता है:) क्या इस के लिए समर्थन जोड़ने का कोई तरीका है: ❤? और शायद कुछ अन्य? यह अब आईओएस इमोजी के लिए पूरी तरह से काम करता है। धन्यवाद। – Kukosk

+2

वैसे यह सवाल है कि आप इमोजी के रूप में क्या गिनते हैं। इमोजी की कल्पना करने से पहले general एक सामान्य प्रतीक के रूप में अस्तित्व में था। तुम सिर्फ प्रतीकों कि है इमोजी के लिए फिर से इस्तेमाल किया गया ब्लॉक करने के लिए, ऊपर पीएचपी लिंक के लिए इमोजी को देखो और सब U + 2XXX कोड का इस्तेमाल किया अंक बाहर लेने चाहते हैं। वैकल्पिक रूप से प्रतीकों में से एक व्यापक रेंज अवरुद्ध करने पर विचार अगर आप उन्हें, जैसे 'unichr की जरूरत नहीं है (0x2190) .'- '। Unichr (0x27FF)'। – bobince

+0

धन्यवाद बॉबन्स :) – Kukosk

2
विकिपीडिया से

:

कोर इमोजी यूनिकोड 6.0 के रूप में सेट, 722 अक्षरों के होते हैं जो 114 पात्रों पूर्व 6.0 यूनीकोड ​​मानक में एक या अधिक वर्णों के क्रम के लिए नक्शे, और की शेष 608 वर्ण पर यूनिकोड 6.0 में पेश किए गए एक या अधिक वर्णों के अनुक्रमों के लिए मानचित्र। [4] इमोजी के लिए विशेष रूप से अलग कोई ब्लॉक नहीं है - नए प्रतीक को सात अलग-अलग ब्लॉक (कुछ नए बनाए गए) में एन्कोड किया गया था, और वहां एक यूनिकोड डेटा फ़ाइल मौजूद है जिसे EmojiSources.txt कहा जाता है जिसमें जापानी विक्रेताओं के लिए और मैपिंग शामिल हैं। विरासत चरित्र सेट।

यहां mapping file है। फ़ाइल में 722 लाइनें हैं, प्रत्येक 722 इमोटिकॉन्स में से एक का प्रतिनिधित्व करता है।

यह इस तरह लगता है क्योंकि एक विशिष्ट इमोजी के लिए अलग सेट ब्लॉक नहीं है वहाँ ऐसा करने के लिए एक आसान बात नहीं है। सभी इमोजी यूनिकोड को कवर करने के लिए आपको अपने रेगेक्स को समायोजित करने की आवश्यकता है।

तुम इतनी तरह एक व्यक्ति यूनिकोड से मेल खा सकते:

\x{1F30F} 

1F30F एक दुनिया के किसी भी इमोटिकॉन के लिए यूनिकोड है।

क्षमा करें मेरे पास आपके लिए पूर्ण उत्तर नहीं है, लेकिन यह आपको सही दिशा में ले जाना चाहिए।

1

सही उत्तर यह पता लगाने के लिए है कि आपके पास Miscellaneous_Symbols_And_Pictographs ब्लॉक में एक निर्दिष्ट कोड बिंदु कहां है। पर्ल में, आप

/\p{Assigned}/ && \p{block=Miscellaneous_Symbols_And_Pictographs}/ 

या सिर्फ

/\P{Cn}/ && /\p{Miscellaneous_Symbols_And_Pictographs}/ 

जो आप

/(?=\p{Assigned})\p{Miscellaneous_Symbols_And_Pictographs}/ 

के साथ एक पैटर्न में उन को संयोजित करना चाहिए का उपयोग करें मुझे याद नहीं है कि PCRE पुस्तकालय है कि PHP उपयोग आपको आवश्यक यूनिकोड चरित्र गुणों तक पहुंच प्रदान करता है। मेरी यादें यह है कि यह उस विशेष क्षेत्र में काफी कमजोर है। मुझे लगता है कि आपके पास केवल यूनिकोड स्क्रिप्ट गुण और सामान्य श्रेणियां हैं। आह।

कभी कभी आप बस असली बात का उपयोग करना होगा।

सभ्य यूनिकोड समर्थन की कमी के लिए, आप अपने आप को ब्लॉक की गणना करने में हो सकता है:

/(?=\P{Cn})[\x{1F300}-\x{1F5FF}]/ 

मेरे लिए एक बुरा सपना रखरखाव, जादू संख्या से भरा ऐसा लगता है।

+0

Seguence भी बड़े पैमाने पर ऑफसेट 19 :( – Kukosk

+0

@Kukosk मैं पता नहीं कि क्या मतलब हो सकता है है यह एक कानूनी सीमा है तुम नहीं के रूप में 'इमोजी सीमा निर्दिष्ट कर सकते है/[\ x {1F300} - \ x {1F5FF}]? /] ' – tchrist

+0

यह अब काम करता है ... लेकिन सभी emojis को नहीं पहचानता है :(जब मैं आईओएस 'इमोजी' कीबोर्ड पर लोगों का उपयोग करें, यदि ऐसा नहीं होता उन्हें पता लगा ... – Kukosk

-2

यही वह है जो मैं आज के साथ आया था।यह शायद इस समस्या के लिए एक अच्छा समाधान नहीं है, लेकिन कम से कम यह काम करता है;)

if(iconv('Windows-1250', 'UTF-8', iconv('UTF-8', 'Windows-1250', $value)) != $value) 
+3

*** आप Microsoft पर ???? *** यही कारण है कि शायद बग है कर रहे हैं: माइक्रोसॉफ्ट, आप इमोजी को संभालने के लिए आवश्यकता होगी सीमा यूनिकोड, विशेष रूप से पूर्ण यूनिकोड के साथ काम कर समस्याओं के बहुत सारे है उन के बाद से बीएमपी के बाहर हैं। आपको एच चाहिए टैग्स में ** विंडोज ** डालें। क्या आप इसके बजाय सामान्य यूनिक्स सिस्टम का उपयोग नहीं कर सके? मैक सस्ते होते हैं जब आप उनके मानक अनुपालन में कारक होते हैं, जो आपको यहां चाहिए। लिनक्स भी सस्ता है। – tchrist

+0

मैं पर एक मैक हूँ;) – Kukosk

+0

मुझे पता चला है कि एक अच्छा 'वैकल्पिक हल' नहीं है ... यह £ के लिए काम नहीं करता है, और कुछ अन्य पात्रों ... – Kukosk

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