2013-02-22 9 views
24

तो मैंने देखा कि जॉन की स्कीट video और एक कोड नमूना था:उच्चारण तारों के साथ एक स्ट्रिंग को उलट दें?

é के साथ कोई समस्या किया जाना चाहिए था - पीछे के बाद लेकिन मैं इसे .net2 (IMHO) पर विफल रहता है लगता है, वैसे भी इसके लिए काम किया है मैंने और मैंने सही उलटा स्ट्रिंग देखा था।

char[] a="Les Misérables".ToCharArray(); 
Array.Reverse(a); 
string n= new string(a); 
Console.WriteLine (n); //selbarésiM seL 

लेकिन मैं इसे आगे ले लिया:

हिब्रू में "Alef" चार है: א

और मैं जैसे विराम चिह्न जोड़ सकते हैं: אֳ (जो मेरा मानना ​​है कि 2 वर्ण के होते हैं - अभी तक एक के रूप में दिखाया गया है)

लेकिन अब देखो क्या होता है:।

char[] a="Les Misאֳrables".ToCharArray(); 
Array.Reverse(a); 
string n= new string(a); 
Console.WriteLine (n); //selbarֳאsiM seL 

एक विभाजन नहीं था ...

मैं समझ सकता क्यों हो रहा है:

Console.WriteLine ("אֳ".Length); //2 

तो सी # में इस मुद्दे को इस तरह का के लिए एक समाधान हो, तो मैं सोच रहा था (या मैं अपने खुद के बनाने चाहिए तंत्र ....)

+4

[TextElementEnumerator] (http: आप कुछ है कि चरित्र दृश्यों के संयोजन यूनिकोड समझता है, TextElementEnumerator की तरह उपयोग करने के लिए है: //msdn.microsoft.com/en-us/library/system.globalization.textelementenumerator.aspx) यहां उपयोगी हो सकता है। –

+0

तो 'ए' दो' अक्षर है? – Jodrell

+0

आपको इसे उत्तर माइकल के रूप में जोड़ना चाहिए। बस लिख रहा था .NET में कोई ऐसी चीज नहीं है ... अच्छी नौकरी। –

उत्तर

35

समस्या यह है कि Array.Reverse पता नहीं है कि char मानों के कुछ अनुक्रम एक वर्ण, या "grapheme" बनाने के लिए गठबंधन कर सकते हैं, और इस प्रकार इसे उलट नहीं किया जाना चाहिए।

// using System.Globalization; 

TextElementEnumerator enumerator = 
    StringInfo.GetTextElementEnumerator("Les Misאֳrables"); 

List<string> elements = new List<string>(); 
while (enumerator.MoveNext()) 
    elements.Add(enumerator.GetTextElement()); 

elements.Reverse(); 
string reversed = string.Concat(elements); // selbarאֳsiM seL 
+0

बस स्पष्ट करने के लिए, क्या यह 'toCharArray()' है जो इन अनुक्रमों से अनजान है, या 'Array.Reverse()' जहां समस्या शुरू होती है? –

+0

@ डेरेक हुनज़ीकर: 'ऐरे। रिवरसे' समस्या है। –

8

यदि आप विस्तार

public static IEnumerable<string> ToTextElements(this string source) 
{ 
    var e = StringInfo.GetTextElementEnumerator(source) 
    while (e.MoveNext()) 
    { 
     yield return e.GetTextElement(); 
    } 
} 

तुम कर सकते हो कर दिया,

const string a = "AnyStringYouLike"; 
var aReversed = string.Concat(a.ToTextElements().Reverse()); 
संबंधित मुद्दे