2017-02-14 3 views
7

यदि मेरे पास "123‍‍‍" जैसी स्ट्रिंग है, तो मैं इसे एक सरणी में कैसे विभाजित कर सकता हूं, जो ["", "1", "2", "3", "‍‍‍"] जैसा दिखता है? अगर मैं ToCharArray() का उपयोग करता हूं तो पहला इमोजी 2 अक्षरों में विभाजित होता है और दूसरा 7 वर्णों में विभाजित होता है।मैं एक यूनिकोड स्ट्रिंग को सी # में एकाधिक यूनिकोड वर्णों में कैसे विभाजित कर सकता हूं?

अद्यतन

समाधान अब इस तरह दिखता है:

public static List<string> GetCharacters(string text) 
{ 
    char[] ca = text.ToCharArray(); 
    List<string> characters = new List<string>(); 
    for (int i = 0; i < ca.Length; i++) 
    { 
     char c = ca[i]; 
     if (c > 65000) continue; 
     if (char.IsHighSurrogate(c)) 
     { 
      i++; 
      characters.Add(new string(new[] { c, ca[i] })); 
     } 
     else 
      characters.Add(new string(new[] { c })); 
    } 
    return characters; 
} 

कृपया ध्यान दें कि, के रूप में टिप्पणी में उल्लेख किया है, यह परिवार इमोजी के लिए काम नहीं करता। यह केवल उन इमोजियों के लिए काम करता है जिनमें 2 अक्षर या उससे कम हैं। उदाहरण का आउटपुट होगा: ["", "1", "2", "3", "‍", "‍", "‍", ""]

+1

'+ + =' मजाकिया, यह नहीं पता था कि – fubo

+1

यह कैसे हुआ? इमोजी पाठ प्रतिपादन इंजन के लिए है। प्रसंस्करण पाठ जिसमें इमोजी शामिल है, चीनी पाठ को संसाधित करने की खुशी के बराबर है। या ज़ल्गो, यदि आप एक असली चुनौती चाहते हैं :) सरोगेट्स को पहचानना अन्यथा रॉकेट विज्ञान नहीं है, Char.IsLowSurrogate() का उपयोग करें। –

उत्तर

5

.NET यूटीएफ -16 तत्वों के अनुक्रम के रूप में स्ट्रिंग का प्रतिनिधित्व करता है। बेस बहुभाषी विमान (बीएमपी) के बाहर यूनिकोड कोड बिंदु एक उच्च और निम्न सरोगेट में विभाजित किया जाएगा। प्रत्येक कोड के निचले 10 बिट्स वास्तविक कोड बिंदु मान के आधे भाग हैं।

इन सरोगेट्स (उदाहरण के लिए Char.IsLowSurrogate) का पता लगाने में सहायक हैं।

आपको इसे स्वयं संभालने की आवश्यकता है।

+0

क्या आपके पास कोई प्रलेखन या पोस्ट है कि ये सरोगेट कैसे काम करते हैं? – mjw

+1

@mjw संपादित करें (और मुझे याद रखने के लिए प्रश्न पर टिप्पणीकर्ता का धन्यवाद)। – Richard

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

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