2015-07-08 12 views
13

Voglio scrivere una stringa Unicode utilizzando valori esadecimali in Swift. Ho letto l'documentation per archi e carattere quindi so che posso usare i caratteri Unicode speciali direttamente nelle stringhe come la seguente:Come esprimere le stringhe in Swift utilizzando valori esadecimali Unicode (UTF-16)

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

Ma mi piacerebbe farlo utilizzando i punti di codice Unicode. I documenti (e this question) lo mostrano per i caratteri, ma non sono molto chiari su come farlo per le stringhe.

(Nota: anche se la risposta mi sembra ovvia ora, non era affatto ovvia poco tempo fa. comprendere Unicode terminologia e come i personaggi e il lavoro Strings Swift.)

risposta

24

aggiornato per Swift 3

carattere

La sintassi Swift per la formazione di un esadecimale code point è

\u{n} 

dove n è un numero esadecimale di lunghezza massima di 8 cifre. L'intervallo valido per un Unicode scalar è da U + 0 a U + D7FF e da U + E000 a U + 10FFFF inclusi. (U + D800 gamma U + DFFF è per surrogate pairs, che non sono scalari stessi, ma vengono utilizzati in UTF-16 per codificare i scalari di maggior valore.)

Esempi:

// 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 

Note :

  • zeri possono essere aggiunti o omesse
  • caratteri sono noti come 0.123.174,393 mila. Anche quando sono composti da più scalari, sono ancora considerati un singolo personaggio. La chiave è che sembrano essere un singolo personaggio (grafema) per l'utente.
  • TODO: How to convert surrogate pair to Unicode scalar in Swift

String

stringhe sono composte di caratteri. Vedere i seguenti esempi per alcuni modi per crearli usando punti di codice esadecimali.

Esempi:

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‼ 

conversione di valori esadecimali a runtime

In fase di esecuzione è possibile convertire i valori esadecimali o Int in un Character o String dalla prima convertirlo in un UnicodeScalar.

Esempi:

// 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‼ 

Letture

+0

@Suragch Ho un carattere Unicode '\ u {} 0D85'. Come ottengo il valore Int da esso? – Isuru

+0

@Isuru, ho chiesto nuovamente e risposto alla tua domanda qui: [Come convertire Unicode Character in Int in Swift] (http://stackoverflow.com/questions/38779114/how-to-convert-unicode-character-to -int-in-swift) – Suragch

+0

@Suragch Grazie mille per la risposta dettagliata. In realtà ho trovato come farlo in questa [risposta] (http://stackoverflow.com/a/24102584/1077789). Ma ancora, bello avere una spiegazione approfondita. – Isuru

1

dal Hex "0x1F52D" per reale Emoji

let c = 0x1F602 

passo successivo sarebbe forse ottenere un Uint32 dal Hex

let intEmoji = UnicodeScalar(c!).value 

da questo si può fare qualcosa di simile

titleLabel.text = String(UnicodeScalar(intEmoji)!) 

qui hai un ""

farlo funzionare con la gamma di esadecimale troppo

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) 
      } 
     } 

per ottenere UInt32 multipla dalla vostra gamma Hex per exemple

+0

Si prega di non pubblicare la stessa risposta a più domande. Se la stessa informazione risponde a entrambe le domande, allora una domanda (di solito quella più nuova) dovrebbe essere chiusa come duplicato dell'altro. Puoi indicarlo [votando per chiuderlo come duplicato] (http://stackoverflow.com/help/privileges/close-questions) o, se non hai abbastanza reputazione per quello, [alzare una bandiera] (http://stackoverflow.com/help/privileges/flag-posts) per indicare che si tratta di un duplicato. Altrimenti, assicurati di adattare la risposta a * questa * domanda e non incollare la stessa risposta in più punti. –

Problemi correlati