2013-03-06 5 views
15

मेरी समस्या:तारों के भीतर से छिपे हुए वर्णों को हटाकर

मेरे पास एक .NET एप्लिकेशन है जो ईमेल के माध्यम से न्यूजलेटर भेजता है। जब समाचार पत्रों को दृष्टिकोण में देखा जाता है, तो दृष्टिकोण एक छिपे हुए चरित्र के स्थान पर एक प्रश्न चिह्न प्रदर्शित करता है जिसे पहचान नहीं सकता है। ये छिपे हुए चरित्र अंतिम उपयोगकर्ताओं से आ रहे हैं जो एचटीएमएल की प्रतिलिपि बनाते हैं और पेस्ट करते हैं जो समाचार पत्रों को एक रूप में बनाता है और इसे प्रस्तुत करता है। एक सी # ट्रिम() इन छिपे हुए वर्णों को हटा देता है यदि वे स्ट्रिंग के अंत या शुरुआत में होते हैं। जब न्यूजलेटर जीमेल में देखा जाता है, तो जीमेल उन्हें अनदेखा करने के लिए एक अच्छा काम करता है। इन छिपे हुए अक्षरों को एक शब्द दस्तावेज़ में चिपकाते समय और मैं "अनुच्छेद चिह्न और छिपे प्रतीकों को दिखाएं" विकल्प को चालू करता हूं, प्रतीक एक बड़े आयताकार के अंदर एक आयताकार के रूप में दिखाई देते हैं। न्यूज़लेटर्स को बनाने वाला पाठ भी किसी भी भाषा में हो सकता है, इसलिए यूनिकोड वर्णों को स्वीकार करना जरूरी है। मैंने चरित्र का पता लगाने के लिए स्ट्रिंग के माध्यम से लूपिंग करने की कोशिश की है लेकिन लूप इसे पहचानता नहीं है और इसे पार करता है। यह भी पूछने से पहले अंतिम उपयोगकर्ता को एचटीएमएल को नोटपैड में पेस्ट करने से पहले प्रश्न पूछना है।

मेरा प्रश्न:
सी # का उपयोग करके इन छिपे हुए अक्षरों को मैं कैसे पहचान और खत्म कर सकता हूं?

newString = oldString.Replace("?", ""); 

जहां:

+0

एक उदाहरण यहाँ रखो .. –

+0

उदाहरण अमान्य मान होगा है कि कर रहे हैं अच्छा। मैं एसिसी पाठ में अपने यूनिकोड तारों का अनुमान लगा रहा हूं, लेकिन फिर यह सिर्फ एक अनुमान है। –

+0

रेगेक्स, केवल अक्षरों को –

उत्तर

42

आप कुछ इस तरह के साथ अपने इनपुट स्ट्रिंग से सभी नियंत्रण वर्ण निकाल सकते हैं।

या आप केवल अक्षर और अंक रखना चाहते हैं, तो आप भी IsLetter और IsDigit फ़ंक्शन का उपयोग कर सकते हैं:

string output = new string(input.Where(c => char.IsLetter(c) || char.IsDigit(c)).ToArray()); 
+0

धन्यवाद, मैं कोशिश करूँगा। मैं इसे एन्कोड करने का प्रयास करूंगा और यह देखने के लिए तुरंत छुपाऊंगा कि छुपा हुआ चार छीन लिया गया है या नहीं। – bradley4

+0

एचटीएमएलएन्कोड/डीकोड किसी भी अक्षर को नहीं हटाता है, यह सुनिश्चित नहीं करता कि आप इसका उपयोग कैसे करते हैं। –

+0

@AlexeiLevenkov हाँ, क्षमा करें, मैंने सवाल को गलत तरीके से पढ़ा है ... मैं तदनुसार अपना उत्तर अपडेट करूंगा। –

1

आप जानते हैं कि इन पात्रों हैं, तो आप string.Replace उपयोग कर सकते हैं "?" उस चरित्र का प्रतिनिधित्व करता है जिसे आप बाहर करना चाहते हैं।

इस दृष्टिकोण के साथ दोष यह है कि यदि आप कई वर्ण हैं जिन्हें आप निकालना चाहते हैं तो आपको बार-बार यह कॉल करने की आवश्यकता है। IsControl() विधि के लिए

string input; // this is your input string 
string output = new string(input.Where(c => !char.IsControl(c)).ToArray()); 

Here is the documentation:

+0

धन्यवाद, लेकिन मैं इस दृष्टिकोण का उपयोग नहीं कर सकता क्योंकि मुझे नहीं पता कि छिपे हुए चार क्या हैं। यह केवल एक प्रश्न चिह्न के रूप में दृष्टिकोण में दिखाई देता है। – bradley4

+1

+1। @ ब्रैडली 4, अगर आपको नहीं पता कि क्या निकालना है (या क्या रखना है) आप लोगों को अपने प्रश्न का उत्तर देने की उम्मीद कैसे करते हैं? –

3

आप ऐसा कर सकते हैं:

var hChars = new char[] {...}; 
var result = new string(yourString.Where(c => !hChars.Contains(c)).ToArray()); 
+0

धन्यवाद है, लेकिन मैं इस दृष्टिकोण का उपयोग नहीं कर सकता क्योंकि मुझे नहीं पता कि छिपे हुए चार क्या हैं। यह केवल एक प्रश्न चिह्न के रूप में दृष्टिकोण में दिखाई देता है। – bradley4

0

थोड़ा समय हो गया है, लेकिन इसका अभी तक जवाब नहीं दिया गया है।

आप कोड भेजने में एचएमटीएल सामग्री कैसे शामिल करते हैं? अगर आप इसे फाइल से पढ़ रहे हैं, तो फ़ाइल एन्कोडिंग जांचें। यदि आप हस्ताक्षर के साथ यूटीएफ -8 का उपयोग कर रहे हैं (नाम संपादकों के बीच थोड़ा भिन्न होता है), तो यह मेल की शुरुआत में अजीब चार का कारण बन सकता है।

12

मैं आमतौर पर सभी गैर-प्रिंट करने योग्य पात्रों को प्रतिस्थापित करने के लिए इस नियमित अभिव्यक्ति का उपयोग करता हूं।

वैसे, ज्यादातर लोग सोचते हैं कि टैब, लाइन फीड और कैरिज रिटर्न गैर-प्रिंट करने योग्य पात्र हैं, लेकिन मेरे लिए वे नहीं हैं।

तो यहाँ

अभिव्यक्ति है:

string output = Regex.Replace(input, @"[^\u0009\u000A\u000D\u0020-\u007E]", "*"); 
  • ^ का मतलब है अगर यह निम्न में से कोई है: है
  • \u0009 टैब
  • \u000A
  • \u000D लाइनफीड है गाड़ी वापसी
  • \u0020-\u007E का अर्थ स्पा से सबकुछ है सीई से ~ - अर्थात, ASCII में सबकुछ है।

यदि आप परिवर्तन करना चाहते हैं तो ASCII table देखें। याद रखें कि यह हर गैर-ASCII चरित्र को बंद कर देगा।

परीक्षण करने के लिए ऊपर आप इस तरह अपने आप को द्वारा एक स्ट्रिंग बना सकते हैं:

string input = string.Empty; 

    for (int i = 0; i < 255; i++) 
    { 
     input += (char)(i); 
    } 
+2

मुझे लगता है कि पहला^सेट को बदलता है, जबकि अन्य^एस वहां नहीं होना चाहिए (आउटपुट से^को बाहर कर देगा)। – Matt

0

स्ट्रिंग उत्पादन = नया स्ट्रिंग (!। Input.Where (ग => char.IsControl (ग)) toArray()) ; यह निश्चित रूप से समस्या का समाधान करेगा। मैं एक स्ट्रिंग में एक गैर मुद्रण योग्य विकल्प characer (ASCII 26) जो मेरे ऐप को तोड़ने के लिए पैदा कर रहा था था और कोड की इस पंक्ति वर्ण

हटाया
2

क्या सबसे अच्छा मेरे लिए काम किया है:

string result = new string(value.Where(c => char.IsLetterOrDigit(c) || (c >= ' ' && c <= byte.MaxValue)).ToArray()); 

मैं कहाँ ' मैं यह सुनिश्चित कर रहा हूं कि चरित्र कोई पत्र या अंक है, ताकि मैं किसी भी गैर-अंग्रेजी अक्षरों को अनदेखा न करूं, या यदि यह एक पत्र नहीं है, तो मैं जांच करता हूं कि यह एक असीसी चरित्र है जो अंतरिक्ष से अधिक या बराबर है, यह सुनिश्चित करने के लिए कि मैं कुछ अनदेखा करता हूं नियंत्रण अक्षर, यह सुनिश्चित करता है कि मैं विराम चिह्न को अनदेखा नहीं करता हूं।

कुछ लोग यह जांचने के लिए IsControl का उपयोग करने का सुझाव देते हैं कि चरित्र गैर प्रिंट करने योग्य है या नहीं, लेकिन उदाहरण के लिए बाएं से दाएं चिह्न को अनदेखा करता है।

3
new string(input.Where(c => !char.IsControl(c)).ToArray()); 

IsControl जैसे कुछ नियंत्रण वर्ण याद करते बाएँ-से-सही निशान (LRM) (चार जो आमतौर पर एक स्ट्रिंग में छुपाता है जबकि कॉपी पेस्ट कर रही है)। आप सुनिश्चित करें कि आपके स्ट्रिंग केवल अंक और संख्या तो आप उपयोग कर सकते हैं IsLetterOrDigit

new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray()) 

अपने स्ट्रिंग विशेष वर्ण, तो है

new string(input.Where(c => c < 128).ToArray()) 
+0

दुर्भाग्यवश, मेरे यूनिट परीक्षण से, अंतिम सुझाव ('नई स्ट्रिंग (इनपुट। जहां (सी => सी <128)। टोएरे())') भी उच्चारण वर्णों को हटा देगा। उदाहरण के लिए, "सियालिज़ासिओन" "सियालिज़ैकॉन" बन जाएगा। –

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