2012-08-15 9 views
34

huh?कैसे इस तरह के Zalgo पाठ

चरित्र ऊपर चित्र कुछ महीने पहले Mikko Hyppönen, एक कंप्यूटर सुरक्षा विशेषज्ञ कंप्यूटर सुरक्षा पर कंप्यूटर वायरस पर अपने काम और TED talks के लिए जाना जाता से ट्वीट किया गया था के रूप में विशेषक के खिलाफ की रक्षा। एसओ के संबंध में, मैं केवल इसकी एक छवि पोस्ट करूंगा, लेकिन आपको विचार मिल जाएगा। यह स्पष्ट रूप से ऐसा कुछ नहीं है जिसे आप अपनी वेबसाइट के चारों ओर फैलाना चाहते हैं और आगंतुकों को बाहर निकालना चाहते हैं।

आगे निरीक्षण पर, चरित्र थाई वर्णमाला के साथ एक थाई वर्णमाला का एक पत्र प्रतीत होता है (यहां तक ​​कि एक सीमा भी है ?!)। इससे मुझे सुरक्षा, स्थानीयकरण और इस तरह के इनपुट को कैसे संभाला जा सकता है, इस बारे में सोच रहा है। मेरी खोज मुझे स्टैक पर this question पर ले जाती है, और बदले में stripping diacritics पर माइकल कपलन से एक ब्लॉग पोस्ट। इस रिपोर्ट में उन्होंने दर्शाता है कि कैसे एक अपने "आधार" अक्षरों में एक स्ट्रिंग (यहाँ संक्षिप्तता की खातिर सरलीकृत) विघटित कर सकते हैं:

StringBuilder sb = new StringBuilder(); 
foreach (char c in "façade".Normalize(NormalizationForm.FormD)) 
{ 
    if (char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
     sb.Append(c); 
} 
Response.Write(sb.ToString()); // facade 

मैं देख सकते हैं कि है कि इस कुछ मामलों में उपयोगी होगा है, लेकिन में उपयोगकर्ता इनपुट की शर्तें, यह सभी उच्चारविज्ञानों को अलग कर देगी। जैसा कि कपलान बताते हैं, कुछ भाषाओं में उच्चारविज्ञान को हटाकर शब्द को पूरी तरह से अर्थ बदल सकते हैं। यह सवाल पूछता है: उपयोगकर्ता इनपुट/आउटपुट में कुछ डायक्रिटिक्स को कैसे अनुमति देता है, लेकिन अन्य लोगों को मिक्को हाइपोपेन के उबर चरित्र जैसे चरम मामलों को बाहर कर देता है?

+1

एक स्थिर वर्ग/उपयोगिता वर्ग के माध्यम से व्हाइटलिस्ट? और यह programmers.stackexchange.com पर जाने के लायक है। –

+2

@MonsterTruck, काफी मेला, लेकिन श्वेतसूची क्या वास्तव में? ये यूनिकोड वर्ण हैं जिनके बारे में मैं बात कर रहा हूं। –

+4

आप प्रति बेस चरित्र की अधिकतम संख्या में डायक्रिटिक्स सेट कर सकते हैं। वियतनामी और ग्रीक अभी भी ठीक है, लेकिन पागल मामलों को अस्वीकार करने के लिए पर्याप्त कम है, तो एक मूल्य इतना ऊंचा उठाओ। –

उत्तर

20

वहाँ भी एक सीमा होती है ?!

यूनिकोड में आंतरिक रूप से नहीं। UAX-15 में 'स्ट्रीम-सेफ' प्रारूप की अवधारणा है जो 30 संयोजकों की सीमा निर्धारित करती है ... सामान्य रूप से यूनिकोड तारों को स्ट्रीम-सेफ़ होने की गारंटी नहीं है, लेकिन यह निश्चित रूप से एक संकेत के रूप में लिया जा सकता है कि यूनिकोड उन नए पात्रों को मानकीकृत करने का इरादा नहीं है जिनके लिए ग्रैफेम क्लस्टर की आवश्यकता होगी।

30 अभी भी एक बहुत भयानक है। सबसे लंबे समय तक ज्ञात प्राकृतिक-भाषा ग्रैफेम क्लस्टर तिब्बती Hakṣhmalawarayaṁ 1 बेस प्लस 8 कंपाइनर्स पर है, इसलिए अब एनएफडी को सामान्यीकृत करना उचित होगा और पंक्ति में 8 से अधिक संयोजकों के किसी अनुक्रम को अस्वीकार करना उचित होगा।

यदि आप केवल सामान्य पश्चिमी यूरोपीय भाषाओं की परवाह करते हैं तो आप शायद इसे नीचे 2 तक ला सकते हैं। इसलिए संभावित रूप से उन लोगों के बीच समझौता करें।

2

मुझे लगता है कि मुझे NormalizationForm.FormD के बजाय NormalizationForm.FormC का उपयोग करके समाधान मिला। MSDN के अनुसार:

[FormC], बताता है कि संभव है कि एक यूनिकोड स्ट्रिंग पूर्ण विहित अपघटन का उपयोग कर सामान्य है, उनके प्राथमिक कंपोजिट साथ दृश्यों के प्रतिस्थापन के बाद।

मैं इसका मतलब यह मानता हूं कि यह वर्णों को उनके मूल रूप में विघटित करता है, फिर उन नियमों के एक सेट के आधार पर उन्हें पुन: संकलित करता है जो लगातार बने रहते हैं। मैं इकट्ठा करता हूं यह तुलना उद्देश्यों के लिए उपयोगी है, लेकिन मेरे मामले में यह सही काम करता है। ü, é, और Ä तरह वर्ण विघटित कर रहे हैं/सही रूप में recomposed, जबकि फर्जी पात्रों को संयोजित करने के लिए, और इस तरह असफल अपने आधार के रूप में रहते हैं:

enter image description here

+2

केवल रचना किए गए वर्णों की आवश्यकता ठीक है यदि आप ऐतिहासिक रूप से सामान्य रूप से उपयोग किए जाने वाले वर्णों के लिए तारों को सीमित करना चाहते हैं - यूनिकोड में अनुकूलता के लिए विरासत एन्कोडिंग में बनाए गए सभी वर्णों के लिए मिश्रित वर्ण शामिल हैं। हालांकि यूनिकोड में नए जोड़े केवल एक विघटित रूप में उपलब्ध हो सकते हैं। – bobince

+0

अन्य combiners प्राप्त करने के लिए, SpacingCombiningMark या संलग्नक के साथ-साथ NonSpacingMark के लिए जाँच करने का सुझाव दें। इसके अलावा 'char' पर पुनरावृत्ति यूटीएफ -16 कोड इकाइयों पर जायेगी, इसलिए आप बेसिक बहुभाषी विमान के बाहर के पात्रों की जांच नहीं कर पाएंगे जिनके लिए आप केवल सरोगेट देखेंगे। संपूर्ण स्ट्रिंग पर एक बार में वर्ण वर्गों को ढूंढने और बदलने के लिए रेगेक्स का उपयोग करने का सुझाव दें। – bobince

+0

जानकारी के लिए धन्यवाद! यदि यह केवल ऐतिहासिक रूप से उपयोग किए जाने वाले वर्णों पर ही काम करता है, तो 2-8 combiners की टोपी सेट करना एक बेहतर समाधान की तरह लगता है! अपने बिंदु को आगे बढ़ाने के लिए, यह विधि तिब्बती प्रतीक को ཧ तक कम कर देती है। एक तिब्बती साधु को समझाओ! –

1

Here's regex जो 'सामान्य' श्रेणी में बाई गई सभी ज़ल्गो को बाहर निकालना चाहिए।

([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62]{2,}) 

एक बार ऐसा करने के बाद, उन्हें पहचानने के लिए सबसे कठिन बात है - वहां कई समाधान हैं।

आशा है कि यह आपको कुछ समय बचाएगा।

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