2010-02-05 6 views
6

मैं अपने एएसपी.NET साइट पर उपयोगकर्ता इनपुट को साफ़ करने के लिए कुछ कोड लिखने पर काम कर रहा हूं। मुझे ASCII वर्ण 145, 146, 147, 148 के सभी संदर्भों को हटाने के लिए इनपुट को साफ़ करने की आवश्यकता है, जो कभी-कभी मेरे मैक उपयोगकर्ताओं से इनपुट प्राप्त कर रहे हैं जो उनके मैक पर एक वर्ड प्रोसेसर में लिखने वाली सामग्री की प्रतिलिपि बना रहे हैं और चिपका रहे हैं।मैन्युअल रूप से ASCII और .NET वर्णों के बीच कनवर्ट करना

मेरा मुद्दा निम्न तीन तारों का है जो मुझे विश्वास है कि एक ही पाठ को आउटपुट करना चाहिए।

string test1 = Convert.ToChar(147).ToString(); 
string test2 = String.Format("'{0}'", Convert.ToChar(147)); 

char[] characters = System.Text.Encoding.ASCII.GetChars(new byte[] { 147 }); 
string test3 = new string(characters); 

फिर भी जब मैं निम्नलिखित

txtShowValues.Text = test1 + "*" + test2 + "*" + test3; 

मैं test1 के लिए एक खाली मूल्य प्राप्त बराबर करने के लिए एक एएसपी पाठ बॉक्स सेट, test2 ठीक से काम करता है, और एक के रूप में test3 आउटपुट '?'।

कोई बता सकता है कि अलग-अलग क्या हो रहा है। मुझे आशा है कि इससे मुझे यह समझने में मदद मिलेगी कि .NET 128 से अधिक अक्षरों के लिए ASCII मानों का उपयोग कैसे कर रहा है ताकि मैं एक अच्छी स्क्रबिंग स्क्रिप्ट लिख सकूं।

संपादित करें
मेरे द्वारा वर्णित मूल्य (145 - 148) घुंघराले उद्धरण हैं। तो सिंगल बाएं, सिंगल राइट, डबल बाएं, डबल राइट।

"सही तरीके से काम करता है" मेरा मतलब है कि यह मेरे ब्राउज़र पर एक घुंघराले उद्धरण आउटपुट करता है।

दूसरा संस्करण
निम्नलिखित कोड (उत्तर में उल्लिखित) घुंघराले उद्धरण भी आउटपुट करता है। तो शायद समस्या परीक्षण 3.

char[] characters2 = System.Text.Encoding.Default.GetChars(new byte[] { 147 }); 
string test4 = new string(characters2); 

तृतीय संपादित
में ASCII उपयोग कर रहा था मैं एक मैक है कि मैं उधार ले सकता मिल गया और समस्या नकल करने में सक्षम था। जब मैं टेक्स्ट को कॉपी और पेस्ट करता हूं जिसमें मैक पर वर्ड से मेरे वेब ऐप में उद्धरण चिह्न होते हैं तो यह घुंघराले उद्धरण (147 और 148) चिपकाता है। जब मैं सहेजता हूं घुंघराले उद्धरण डेटाबेस में सहेजे जाते हैं, तो मैं उस कोड का उपयोग करूंगा जिसने आप सभी को उस सामग्री को साफ़ करने के लिए मेरी मदद की।

FOUTH EDIT
प्रतिक्रियाओं के आधार पर अधिक नमूना कोड लिखने के लिए कुछ समय बिताएं और ध्यान दें कि एएसपी.नेट में मल्टीलाइन टेक्स्टबॉक्स के साथ इसका कुछ संबंध है। यहां अच्छी जानकारी थी, इसलिए मैंने बस एक नया प्रश्न शुरू करने का फैसला किया: ASP.NET Multiline textbox allowing input above UTF-8

+3

.NET यूनिकोड का उपयोग करता है। –

+0

लेकिन फिर test2 क्यों काम करता है? अगर कुछ भी मुझे टेस्ट 3 काम करने की उम्मीद है। –

+0

'सही तरीके से काम करता है' से आपका क्या मतलब है? यह एक अदृश्य नियंत्रण चरित्र है - इसे रिक्त स्ट्रिंग के रूप में प्रदर्शित करना है। आप किस आउटपुट की अपेक्षा करते हैं? –

उत्तर

10

कैरेक्टर 147 यू +00 9 3 एसईटी ट्रांसमिशन स्टेट है। 0-255 की सीमा में सभी यूनिकोड वर्णों की तरह, यह एक ही संख्या के आईएसओ -885 9 -1 चरित्र के समान है। आईएसओ -885 9 -1 इस अदृश्य नियंत्रण कोड को 147 असाइन करता है।

क्या आप के बारे में सोच रहे हैं 'ASCII' या यहाँ तक कि 'ISO-8859-1' नहीं है, लेकिन विंडोज कोड पेज 1252. यह एक गैर मानक एन्कोडिंग कि है 8859-1 तरह है, लेकिन पात्रों प्रदान करती है 128-159 विभिन्न टाइपोग्राफ़िकल एक्सटेंशन जैसे कि बड़े पैमाने पर बेकार नियंत्रण कोडों के बजाय स्मार्ट कोट्स जैसे। कोड पृष्ठ 1252 में, चरित्र 147 है, उर्फ ​​यू + 201 सी बाएं डबल कोटेशन मार्क।

आप Windows कोड पृष्ठों यूनिकोड वर्ण के लिए आप उदाहरण के लिए, कोड पेज आप चाहते हैं निर्दिष्ट करना होगा (अक्सर गुमराह 'एएनएसआई' के रूप में जाना जाता है) में परिवर्तित करना चाहते हैं:

System.Text.Encoding.getEncoding(1252).GetChars(new byte[] { 147 }) 

System.Text.Encoding.Default आप दे देंगे आपके सर्वर पर डिफ़ॉल्ट एन्कोडिंग। पश्चिमी यूरोपीय लोकेल में एक सर्वर के लिए, यह 1252 होगा। कहीं और, यह नहीं होगा। सर्वर अनुप्रयोग में लोकेल के डिफ़ॉल्ट कोड पेज पर निर्भरता रखना आम तौर पर एक अच्छा विचार नहीं है।

किसी भी मामले में, आपको को वेब अनुप्रयोग में इनपुट में का प्रतिनिधित्व करने वाले 147 जैसे बाइट प्राप्त करना चाहिए। यह तभी होगा जब आपका पृष्ठ कोड कोड 1252 एन्कोडिंग में है (और केवल भ्रमित और गुमराह करने के लिए, जब आप कहते हैं कि आपका पृष्ठ आईएसओ -885 9 -1 प्रारूप में है, तो ब्राउजर चुपचाप कोड पेज 1252 का उपयोग करेंगे)। आपका पृष्ठ 1252 में भी हो सकता है यदि आप इसके लिए कोई एन्कोडिंग निर्दिष्ट करने में विफल रहे हैं (ब्राउज़र अनुमान लगाता है; अन्य लोकल अलग-अलग कोड पेज अनुमान लगाएंगे, इसलिए यह सब एक बड़ी गड़बड़ी होगी)।

आप अपने वेब एप्लिकेशन, और mark your pages as such में सभी एन्कोडिंग के लिए UTF-8 का उपयोग सुनिश्चित करें। आज, सभी वेब ऐप्स यूटीएफ -8 का उपयोग करना चाहिए।

+0

@bobince - महान जानकारी, बहुत बहुत धन्यवाद।मुझे नहीं लगता कि आपके पास इस तरह की चीजों के बारे में दस्तावेज़ीकरण के लिए कोई लिंक होगा? मैं जगह में एक फिक्स डालने से पहले इस मुद्दे के बारे में जितना संभव हो सीखने की कोशिश कर रहा हूं। –

+0

स्पॉल्स्की लेख आमतौर पर इस बिंदु पर पहिया हो जाता है! (http://www.joelonsoftware.com/articles/Unicode.html) ... मेरे पास इसमें कुछ सामग्री के बारे में मेरा आरक्षण है, लेकिन मुझे लगता है कि यह एक उचित पर्याप्त प्राइमर है। – bobince

+0

@bobince - क्या कोई मौका है कि एक उपयोगकर्ता प्रोसेसर से उपयोगकर्ता कॉपी और पेस्ट करने से मूल्य वेब इंटरफ़ेस में भेजे जाएंगे? यह एक बहुत ही दुर्लभ समस्या है, लेकिन प्रत्येक उपयोगकर्ता ने साक्षात्कार दिया है कि वे अपने मैक पर अपने वर्ड प्रोसेसर से कॉपी और पेस्ट कर रहे थे। –

0

मुझे कंसोल ऐप (.NET 3.5SP1) में उन सभी 3 के लिए प्रश्न चिह्न मिलते हैं। जहां तक ​​मुझे पता है, वे सभी बराबर होना चाहिए। जॉन नोवेलर एएससीआईआई बनाम एएनएसआई के संबंध में सही है।

क्या आपने मूल स्ट्रिंग पर एन्कोडिंग क्लासेस 'गेटबाइट्स() में से किसी एक का उपयोग करने और इसे हटाने के लिए, "अच्छे" बाइट्स को अन्य बफर में कॉपी करके) उन मानों को कॉपी करने का प्रयास किया है जिन्हें आप नहीं चाहते हैं?

उदा। (LINQ का उपयोग कर):

byte[] original = System.Text.Encoding.ASCII.GetBytes(badString); 
byte[] clean = (from b in original where b < 145 || b > 148 select b).ToArray<byte>(); 
string cleanString = System.Text.Encoding.ASCII.GetString(clean); 

ASCII शायद गलत यहाँ उपयोग करने के लिए, ईमानदार होना है, यदि मूल पाठ यूनिकोड है तो यह बुरी चीजें कर सकता है (उदाहरण के लिए यदि आप यूटीएफ -16 पास करते हैं)।

3

नेट यूनिकोड का उपयोग करता है (यूसीएस -2) जो केवल नीचे 128

ASCII मूल्यों 127 से ऊपर मूल्यों को परिभाषित नहीं करता के लिए ASCII के समान है।

मुझे लगता है कि आप एएनएसआई, जो (अधिकतर) भाषा अधिकांश यूरोपीय भाषाओं के लिए आवश्यक पात्रों के रूप में 127 से ऊपर मूल्यों को परिभाषित करता है के बारे में सोच हो सकती है। या OEM (मूल आईबीएम पीसी चरित्र सेट) जो अक्षर> 127 को (ज्यादातर) प्रतीकों के रूप में परिभाषित करता है।

कैसे 127 से ऊपर पात्रों में व्याख्या कर रहे हैं एक कोड पेज, या एक एन्कोडिंग कहा जाता है में अंतर। (इसलिए System.Text.Encoding)। तो यदि आप एक अलग एन्कोडिंग का उपयोग करते हैं, तो शायद आप System.Text.Encoding.Default का उपयोग कर परीक्षण 3 प्राप्त कर सकते हैं।

संपादित करें: ठीक है, अब हम जानते हैं कि कि एन्कोडिंग आप चाहते हैं एएनएसआई है, यह स्पष्ट क्या हो रहा है है। आम तौर पर एक बॉक्स -

चरित्र रूपांतरण के लिए नियम अक्षर है कि कुछ अन्य चरित्र के रूप में एन्कोडिंग में नहीं दर्शाया जा सकता को बदलने के लिए है। लेकिन एएससीआईआईआई के लिए, कोई बॉक्स कैरेक्टर नहीं है, इसलिए यह एक का उपयोग करता है? बजाय। यह परीक्षण बताते हैं 3.

test1 और 2 दोनों एक पूर्णांक लगातार साथ Convert.ToChar उपयोग कर रहे हैं। जो यूनिकोड चरित्र के रूप में इनपुट की व्याख्या करेगा, एएनएसआई चरित्र नहीं, इसलिए कोई रूपांतरण लागू नहीं किया जा रहा है। यूनिकोड चरित्र 147 एक गैर-प्रिंटिंग चरित्र है।