2008-10-08 12 views
27

कहें कि आपने एक स्ट्रिंग में एक टेक्स्ट फ़ाइल लोड की है, और आप सभी यूनिकोड एस्केप को स्ट्रिंग के अंदर वास्तविक यूनिकोड वर्णों में कनवर्ट करना चाहते हैं।मैं यूनिकोड से बचने के अनुक्रमों को एक .NET स्ट्रिंग में यूनिकोड वर्णों में कैसे परिवर्तित करूं?

उदाहरण:

"। यूनिकोड '\ u2320' में एक अभिन्न चरित्र के ऊपर का आधा है निम्नलिखित है, और इस निचले आधे '\ U2321' है"

उत्तर

45

उत्तर सरल है और कम से कम कई हजार वर्णों तक तारों के साथ अच्छी तरह से काम करता है।

उदाहरण 1:

Regex rx = new Regex(@"\\[uU]([0-9A-F]{4})"); 
result = rx.Replace(result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString()); 

उदाहरण 2:

Regex rx = new Regex(@"\\[uU]([0-9A-F]{4})"); 
result = rx.Replace(result, delegate (Match match) { return ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); }); 

पहला उदाहरण प्रतिस्थापन एक लैम्ब्डा अभिव्यक्ति (सी # 3.0) और दूसरे का उपयोग किया जा रहा से पता चलता एक प्रतिनिधि जो साथ काम करना चाहिए का उपयोग करता है सी # 2.0।

नीचे तोड़ने के लिए यहाँ क्या हो रहा है, पहले हम एक नियमित अभिव्यक्ति बनाएँ:

new Regex(@"\\[uU]([0-9A-F]{4})"); 

फिर हम बदलें फोन() स्ट्रिंग 'परिणाम' के साथ और एक गुमनाम विधि (पहले उदाहरण में लैम्ब्डा अभिव्यक्ति और दूसरे में प्रतिनिधि - प्रतिनिधि भी एक नियमित विधि हो सकता है) जो स्ट्रिंग में पाए जाने वाले प्रत्येक नियमित अभिव्यक्ति को परिवर्तित करता है।

यूनिकोड बच इस तरह संसाधित किया जाता है:

((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); }); 

स्ट्रिंग भागने की संख्या हिस्सा (पहले दो वर्ण छोड़) का प्रतिनिधित्व प्राप्त करें।

match.Value.Substring(2) 

) जो स्ट्रिंग और संख्या स्वरूप है कि पार्स() फ़ंक्शन की उम्मीद करनी चाहिए जो इस मामले में एक हेक्स संख्या है लेता है कि स्ट्रिंग Int32.Parse (का उपयोग कर पार्स।

(char) 

और अंत में हम कहते हैं toString() यूनिकोड वर्ण है जो हमें अपने स्ट्रिंग प्रतिनिधित्व कर रहा है जो मूल्य वापस पारित कर दिया बदलें के लिए देता है पर:

NumberStyles.HexNumber 

फिर हम एक यूनिकोड वर्ण के परिणामस्वरूप संख्या डाली():

.ToString() 

नोट: पाठ हथियाने के बजाय एक सबस्ट्रिंग आप मैच पैरामीटर के GroupCollection इस्तेमाल कर सकते हैं कॉल के साथ परिवर्तित किया है, और में एक subexpressions केवल संख्या ('2320') को पकड़ने के लिए नियमित अभिव्यक्ति, लेकिन यह अधिक जटिल और कम पठनीय है।

+2

\ यू और \ यू अलग ढंग से व्यवहार किया जाना चाहिए - \ यू निर्दिष्ट करता है 4 हेक्स अंक (16 बिट), जहां \ यू निर्दिष्ट करता है 8 (32 बिट्स) - एक यूनिकोड कोडपॉइंट 21 बिट लंबा है। साथ ही, आपको कलाकारों के बजाय char.ConvertFromUtf32() विधि का उपयोग करना चाहिए। –

+0

मैंने देखा है कि \ u और \ U ने दोनों तरीकों से दस्तावेज किया है, हालांकि वर्तमान सी # भाषा विनिर्देश \ u और 8 हेक्स बाइट्स के लिए \ u के लिए 4 हेक्स बाइट इंगित करता है। किसी भी मामले में, \ 4 केवल 4 हेक्स अंकों के साथ सही ढंग से संसाधित किया जाता है। जांचें कि ConvertFromUtf32() एक कलाकार से कार्यात्मक रूप से अलग है या नहीं। –

+0

हाँ, मैंने खुद को महसूस करने के बाद पोस्ट के दूसरे भाग में अनदेखा विकल्प पढ़ा। धन्यवाद औश्र सबकुछ वही है। :) – Echilon

8

थोड़ा और पुनर्स्थापन:

Regex regex = new Regex (@"\\U([0-9A-F]{4})", RegexOptions.IgnoreCase); 
string line = "..."; 
line = regex.Replace (line, match => ((char)int.Parse (match.Groups[1].Value, 
    NumberStyles.HexNumber)).ToString()); 
0

मुझे लगता है कि आप बेहतर अपने रेगुलर एक्सप्रेशन को छोटे अक्षरों में जोड़ें। यह मेरे लिए बेहतर काम किया।

Regex rx = new Regex(@"\\[uU]([0-9A-Fa-f]{4})"); 
result = rx.Replace(result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString()); 
5

यह VB.NET बराबर है:

Dim rx As New RegularExpressions.Regex("\\[uU]([0-9A-Fa-f]{4})") 
result = rx.Replace(result, Function(match) CChar(ChrW(Int32.Parse(match.Value.Substring(2), Globalization.NumberStyles.HexNumber))).ToString()) 
संबंधित मुद्दे

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