2012-05-11 27 views
18

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

एक यूटीएफ -8 बाइट अनुक्रम "ई 2-80-ए 8" (यू +2028, लाइन SEPARATOR), यूनिकोड डेटाबेस में एक बिल्कुल मान्य चरित्र है। हालांकि, यह अनुक्रम एक रेखा-विभाजक का प्रतिनिधित्व करता है (हां, अन्य तो "0 ए")।

और बुरी तरह से, क्रोम, फ़ायरफ़ॉक्स और सफारी समेत कई ब्राउज़र; मैंने दूसरों का परीक्षण नहीं किया), जेएसओएनपी कॉलबैक को संसाधित करने में असफल रहा जिसमें एक स्ट्रिंग है जिसमें यूनिकोड चरित्र शामिल है। JSONP को एक गैर-यूनिकोड HTML द्वारा शामिल किया गया था जिसका मेरा कोई नियंत्रण नहीं था।

ब्राउज़र ने ऐसी जावास्क्रिप्ट पर केवल INVALID कोड/वाक्यविन्यास त्रुटि की सूचना दी जो डीबग टूल और सभी टेक्स्ट संपादकों से मान्य दिखता है। मुझे लगता है कि यह "E2-80-A8" को BIG-5 में परिवर्तित करने का प्रयास कर सकता है और जेएस सिंटैक्स तोड़ सकता है।

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

प्रश्न:

वहाँ हर प्रोग्रामर छिपा विशेषताएं (और कीड़े) जो हम उन्हें हमारे आवेदन में प्रभावी नहीं चाहते हो सकता है के बारे में पता करने के लिए यूनिकोड वर्ण की एक सूची है। (उदाहरण के लिए फ़ाइल फ़ाइल नाम में आरटीएल अक्षम)।

संपादित करें:

मैं JSON है और न ही जावास्क्रिप्ट के लिए पूछ नहीं कर रहा हूँ। मैं सभी कार्यक्रमों में यूनिकोड हैंडिंग के सामान्य सर्वोत्तम अभ्यास के लिए पूछ रहा हूं।

+1

के लिए ICU project पर एक नज़र डालें। जब ब्राउज़र जेएसओएन की गलत व्याख्या करते हैं, जिसका एन्कोडिंग स्पष्ट रूप से यूटीएफ -8 है, एक अलग एन्कोडिंग के रूप में, गलती ब्राउज़र के साथ होती है; और * वे * तय किया जाना चाहिए। जेएसओएन को जोड़ना समाधान नहीं है। – daxim

उत्तर

3

वहाँ चरित्र गुण के एक डेटाबेस है और UNICODE CHARACTER DATABASE का वर्णन करने वाली एक रिपोर्ट, जो कि एक कोड बिंदु का इलाज करने के लिए ब्राउज़र को "चाहिए" के बारे में एक अच्छा विचार देता है। मुझे वह शब्द पसंद है, "चाहिए"। सबसे सुरक्षित एक श्वेतसूची होने जा रहा है, आप शायद एल | एम | एन | एस, पत्र या मार्क या संख्या या प्रतीक के साथ जा सकते हैं।

के बाद से JSON, यूनिकोड के लिए एक सामान्य क्रमबद्धता स्वरूप है ** कुछ भी नहीं ** फ़िल्टर किया जाना चाहिए या आप इंटरॉप तोड़ एक पुस्तकालय

+0

प्रश्न का उत्तर देने के लिए धन्यवाद –

8

यह जावास्क्रिप्ट टूट जाता है क्योंकि तार उन में नई-पंक्तियों की जरूरत नहीं कर सकते हैं:

var myString = "
"; 

//Syntax Error 
:

var myString = " 

"; 

//SyntaxError: Unexpected token ILLEGAL 

अब, UTF-8 अनुक्रम "E2-80-A8" यूनिकोड कोड बिंदु U+2028, जो समान व्यवहार किया जाता है जावास्क्रिप्ट में न्यू लाइन करने के लिए करने के लिए डीकोड

हालांकि यह लिखने के लिए सुरक्षित है,

var myString = "\u2028"; 
//you can now log myString in console and get real representation of this character 

जो जेएसओएन को ठीक से एन्कोड किया गया है। मैं असुरक्षित पात्रों की एक ब्लैकलिस्ट रखने के बजाय जेएसओएन को ठीक से एन्कोड करना चाहता हूं। (जो यू +2028 और यू + 2029 AFAIK हैं)।

PHP में:

echo json_encode(chr(0xe2). chr(0x80).chr(0xA8)); 
//"\u2028" 
+0

JSON केवल एक उदाहरण है। एक्सएमएल एनकोड, एचटीएमएल टेक्स्ट, एचटीएमएल एट्रिब्यूट, एसक्यूएल, यूआरआई एन्कोडिंग, फ़ाइल नाम, ईमेल पता, डोमेन नाम ... आदि हैं। उपर्युक्त उदाहरण में, यह पहले से ही ढांचे से प्रदान की गई एन्कोडिंग विधि का उपयोग कर रहा है; और जो स्पष्ट रूप से एक बग है। एपीआई का उपयोग करके, यह सुनिश्चित नहीं हुआ कि चरित्र से बचने के लिए हमेशा सही हो और जब इसे तोड़ दिया जाए तो आपको DIY करना पड़ सकता है। –

+0

अधिक विशिष्टता, जेएसओएनपी स्प्रिंग एमवीसी एपीआई द्वारा उत्पन्न किया गया था। –

+0

@DennisCheung JSONP को जावास्क्रिप्ट कोड के रूप में निष्पादित किया गया है जबकि वे अन्य डेटा हैं, मैं नहीं देखता कि उनके साथ इसका कोई संबंध नहीं है। आपके द्वारा वर्णित समस्या केवल JSONP में लागू होती है। – Esailija

3

A-Z, a-z और 0-9 आम तौर पर सुरक्षित हैं। उन 62 पात्रों के बाहर, आप कुछ सिस्टम के साथ समस्याओं का सामना करेंगे। कोई अन्य जवाब नहीं दे सकता है जो आपको दे सकता है।

उदाहरण के लिए, आप डोमेन नामों का उल्लेख करते हैं। यूनिकोड डोमेन नामों को संभालने का एकमात्र तरीका आरएफसी 3454 और आरएफसी 5890-58 9 3 का पालन करना है, और डेटा को इस तरह से और उसी तरह से संसाधित करना है। अधिकांश यूनिक्स फाइल सिस्टम पर फ़ाइल नाम बाइट्स के मनमानी तार हैं जिनमें/या \ 0 शामिल नहीं है। यूनिक्स पर यूनिकोड स्ट्रिंग के रूप में कुछ भी तोड़ने के बिना कार्यात्मक रूप से एक फ़ाइल नाम का इलाज करना एक प्रश्न है। ध्यान दें कि विंडोज फ़ाइल नाम ए-जेड सुरक्षित नहीं हैं; एनयूएल और पीआरएन जैसी चीजें आरक्षित नाम हैं। प्रत्येक डोमेन अपने स्वयं के छोटे मुद्दों और quirks जा रहा है, और हर जगह के लिए पर्याप्त सरल सारांश होने जा रहा है।

+0

यह मुझे समझ में नहीं आता है। अगर हम केवल ए-जेड 0 9 का उपयोग कर सकते हैं, तो यूटीएफ -8 क्या है? यह दिन की तरह 7-बिट बीबीएस नेटवर्क की तरह लगता है और आपको बेस 64 सबकुछ करना होगा। यूनिकोड में बहुत से डिज़ाइन किए गए फीचर हैं जिन्हें हमें सीखना और समझना चाहिए बल्कि उन्हें अनदेखा करना चाहिए। –

+0

मैं नहीं कह रहा हूं कि यूनिकोड का उपयोग न करें। मैं कह रहा हूं कि आपने डोमेन नाम प्रणाली के बारे में पूछा है; आपको उन आरएफसी 3454 और 5890-58 9 3 को देखने की जरूरत है। आपने फाइलनामों के बारे में पूछा; POSIX फ़ाइल नाम बाइट्स की एक मनमानी स्ट्रिंग हैं जिसमें \ 0 या \ x2F नहीं है। विंडोज फाइलनाम केस-असंवेदनशील यूटीएफ -16 हैं और एएससीआईआई आरक्षित नामों के एक सेट को छोड़कर जरूरत है। उन में क्या हो सकता है के औपचारिक उत्तर कोई समानता नहीं है। – prosfilaes

+0

विंडोज फ़ाइल नाम एक अच्छा उदाहरण है। आरटीएल फ़ाइल नाम विनिर्देश में मान्य है (एक वायरस इसका उपयोग करता था), लेकिन यह तथ्य है कि इसे अवरुद्ध किया जाना चाहिए। आप इसे विनिर्देश/आरएफसी से नहीं पढ़ सकते हैं। यहां तक ​​कि आरएफसी को लिखने के लिए भी यूनिकोड को पता है कि वह उन खतरनाक चरित्र को सूची को बाहर करने के लिए रख सकता है। –

4

यूनिकोड चार्ट देखें। गैर-प्रिंटिंग वर्णों की एक सूची है। ये वे हैं जो संभावित परेशानी करने वाले होंगे। आपके मित्र यू +2028 में दोस्तों का एक समूह है: http://www.unicode.org/charts/PDF/U2000.pdf और यह केवल 2000 रेंज में नहीं है।

आप या तो उन सब को परमाणु, या उन्हें विभिन्न श्रेणियों में अलग कर सकते थे (U + 2028 की तरह सितम्बर वर्ण \ N बनने या सही तरीके से छोड़े), आदि

HTH

+1

मेरी दो दिवसीय समस्या को ठीक किया गया, धन्यवाद। – eabates