2015-07-08 6 views
13

का उपयोग कर स्विफ्ट में स्ट्रिंग्स को कैसे व्यक्त करें मैं स्विफ्ट में हेक्साडेसिमल मानों का उपयोग करके यूनिकोड स्ट्रिंग लिखना चाहता हूं। मैं स्ट्रिंग के लिए documentation और चरित्र को पढ़ लिया है तो मुझे पता है कि मैं इस तरह का तार में सीधे विशेष यूनिकोड वर्ण का उपयोग कर सकते हैं:यूनिकोड हेक्साडेसिमल मानों (यूटीएफ -16)

var variableString = "Cat‼" // "Cat" + Double Exclamation + cat emoji 

लेकिन मैं यूनिकोड कोड अंक का उपयोग कर यह करने के लिए करना चाहते हैं। दस्तावेज़ (और this question) इसे वर्णों के लिए दिखाएं, लेकिन स्ट्रिंग के लिए इसे कैसे करें इसके बारे में बहुत स्पष्ट नहीं हैं।

(नोट: हालांकि उत्तर अब मेरे लिए स्पष्ट प्रतीत होता है, यह कुछ समय पहले स्पष्ट नहीं था। मैं यह सीखने के साधन के रूप में नीचे अपना खुद का प्रश्न उत्तर दे रहा हूं और खुद की मदद करने के लिए भी यूनिकोड शब्दावली और कैसे स्विफ्ट वर्ण और स्ट्रिंग्स काम को समझते हैं।)

उत्तर

24

स्विफ्ट 3 के लिए

चरित्र

हेक्साडेसिमल code point बनाने के लिए स्विफ्ट वाक्य रचना

है अपडेट किया गया
\u{n} 

जहां एन एक हेक्साडेसिमल संख्या 8 अंकों तक लंबी है। यूनिकोड scalar के लिए मान्य सीमा U + 0 से U + D7FF और U + E000 से U + 10FFFF समावेशी है। (U + DFFF श्रृंखला के लिए U + D800 surrogate pairs के लिए है, खुद को Scalars नहीं कर रहे हैं जो है, लेकिन उच्च मूल्य scalars एन्कोड करने के लिए UTF-16 में किया जाता है।)

उदाहरण:

// The following forms are equivalent. They all produce "C". 
let char1: Character = "\u{43}" 
let char2: Character = "\u{0043}" 
let char3: Character = "\u{00000043}" 

// Higher value Unicode scalars are done similarly 
let char4: Character = "\u{203C}" // ‼ (DOUBLE EXCLAMATION MARK character) 
let char5: Character = "\u{1F431}" // (cat emoji) 

// Characters can be made up of multiple scalars 
let char7: Character = "\u{65}\u{301}" // é = "e" + accent mark 
let char8: Character = "\u{65}\u{301}\u{20DD}" // é⃝ = "e" + accent mark + circle 

नोट्स :

  • अग्रणी शून्य जोड़ा या छोड़े गए
  • वर्ण +०१२३१७४३९३ रूप में जाना जाता किया जा सकता है। यहां तक ​​कि जब वे कई स्केलर से बने होते हैं, तब भी उन्हें एक ही चरित्र माना जाता है। कुंजी क्या है कि वे उपयोगकर्ता को एक एकल चरित्र (grapheme) दिखाई देते हैं।
  • कार्यसूची: How to convert surrogate pair to Unicode scalar in Swift

स्ट्रिंग

स्ट्रिंग्स पात्रों में से बना रहे हैं। हेक्साडेसिमल कोड बिंदुओं का उपयोग करके उन्हें बनाने के कुछ तरीकों के लिए निम्न उदाहरण देखें।

उदाहरण:

var string1 = "\u{0043}\u{0061}\u{0074}\u{203C}\u{1F431}" // Cat‼ 

// pass an array of characters to a String initializer 
let catCharacters: [Character] = ["\u{0043}", "\u{0061}", "\u{0074}", "\u{203C}", "\u{1F431}"] // ["C", "a", "t", "‼", ""] 
let string2 = String(catCharacters) // Cat‼ 

रनटाइम

पर हेक्स मान परिवर्तित क्रम आप पहली बार यह एक UnicodeScalar को परिवर्तित करके एक Character या String में हेक्साडेसिमल या Int मूल्यों में बदल सकते हैं पर।

उदाहरण:

// hex values 
let value0: UInt8 = 0x43  // 97 
let value1: UInt16 = 0x203C // 22823 
let value2: UInt32 = 0x1F431 // 127822 

// convert hex to UnicodeScalar 
let scalar0 = UnicodeScalar(value0) 
// make sure that UInt16 and UInt32 form valid Unicode values 
guard 
    let scalar1 = UnicodeScalar(value1), 
    let scalar2 = UnicodeScalar(value2) else { 
    return 
} 

// convert to Character 
let character0 = Character(scalar0) // C 
let character1 = Character(scalar1) // ‼ 
let character2 = Character(scalar2) // 

// convert to String 
let string0 = String(scalar0) // C 
let string1 = String(scalar1) // ‼ 
let string2 = String(scalar2) // 

// convert hex array to String 
let myHexArray = [0x43, 0x61, 0x74, 0x203C, 0x1F431] // an Int array 
var myString = "" 
for hexValue in myHexArray { 
    if let scalar = UnicodeScalar(hexValue) { 
     myString.append(Character(scalar)) 
    } 
} 
print(myString) // Cat‼ 

आगे पढ़ने

+0

@Suragch मैं एक यूनिकोड चरित्र '\ यू {0D85}' की है। मैं इससे इंट वैल्यू कैसे प्राप्त करूं? – Isuru

+0

@ इसुरु, मैंने फिर से पूछा है और आपके प्रश्न का उत्तर दिया है: [यूनिकोड कैरेक्टर टू इंट इन स्विफ्ट में कैसे परिवर्तित करें] (http://stackoverflow.com/questions/38779114/how-to-convert-unicode-character-to -इंटर-इन-स्विफ्ट) – Suragch

+0

@ सुरागच विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। मुझे वास्तव में यह पता चला कि यह [उत्तर] में कैसे करें (http://stackoverflow.com/a/24102584/1077789)। लेकिन फिर भी, पूरी तरह से स्पष्टीकरण के लिए अच्छा है। – Isuru

1
अपने हेक्स "0x1F52D" से वास्तविक इमोजी को

let c = 0x1F602 

अगले कदम संभवतः इस से अपने हेक्स

let intEmoji = UnicodeScalar(c!).value 

से एक uint32 हो रही हैं आप

titleLabel.text = String(UnicodeScalar(intEmoji)!) 
की तरह कुछ कर सकते हैं

यहां आपके पास

है

यह भी हेक्साडेसिमल की सीमा के साथ काम

let emojiRanges = [ 
      0x1F600...0x1F636, 
      0x1F645...0x1F64F, 
      0x1F910...0x1F91F, 
      0x1F30D...0x1F52D 
     ] 

     for range in emojiRanges { 
      for i in range { 
       let c = UnicodeScalar(i)!.value 
       data.append(c) 
      } 
     } 

उदाहरण के लिए अपने हेक्स सीमा से आने वाले अनेक UInt32 पाने के लिए

+0

कृपया एकाधिक प्रश्नों के लिए एक ही उत्तर पोस्ट न करें। यदि वही जानकारी वास्तव में दोनों प्रश्नों का उत्तर देती है, तो एक प्रश्न (आमतौर पर नया) दूसरे के डुप्लिकेट के रूप में बंद होना चाहिए। आप इसे [डुप्लिकेट के रूप में बंद करने के लिए वोटिंग] द्वारा इंगित कर सकते हैं (http://stackoverflow.com/help/privileges/close-questions) या, यदि आपके पास इसके लिए पर्याप्त प्रतिष्ठा नहीं है, [ध्वज उठाएं] (http://stackoverflow.com/help/privileges/flag-posts) यह इंगित करने के लिए कि यह एक डुप्लिकेट है। अन्यथा, सुनिश्चित करें कि आप * इस * प्रश्न का उत्तर दें और एक ही उत्तर को कई स्थानों पर पेस्ट न करें। –

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