Pregunta

Al igual que otros caracteres emoji, la combinación 0x0001F1E9 0x0001F1EA (bandera alemana) se representa como un solo carácter en la pantalla, aunque en realidad se trata de dos puntos de caracteres Unicode diferentes combinados.¿Está representado como uno o dos personajes diferentes en Swift?

¿Fue útil?

Solución

let flag = "\u{1f1e9}\u{1f1ea}"

entonces flag es 🇩🇪 .

Para obtener más símbolos de indicadores regionales, consulte:
http://en.wikipedia.org/wiki/Regional_Indicator_Symbol

Otros consejos

Soporte para "grupos de grafemes extendidos" se ha agregado a SWIFT mientras tanto. Iterando sobre los personajes de una cadena produce un solo carácter para las "banderas":

let string = "Hi🇩🇪!"
for char in string.characters {
    print(char)
}

Salida:

H
i
🇩🇪
!

Swift 3 implementa Unicode en su String estructura.En Unicode, todas las banderas son pares de Símbolos de indicadores regionales.Entonces, 🇩🇪 es en realidad 🇩 seguido por 🇪 (¡Intenta copiar los dos y pegarlos uno al lado del otro!).

Cuando dos o más símbolos de indicadores regionales se colocan uno al lado del otro, forman un "grupo de grafemas extendido", lo que significa que se tratan como un solo carácter.Esta es la razón por "🇪🇺 = 🇫🇷🇪🇸🇩🇪...".characters te dio ["🇪🇺", " ", "=", " ", "🇫🇷🇪🇸🇩🇪", ".", ".", "."].

Si desea ver cada punto de código Unicode (también conocido como "escalar"), puede usar .unicodeScalars, de modo que "Hi🇩🇪!".unicodeScalars te dio ["H", "i", "🇩", "🇪", "!"]

tl; dr

🇩🇪 es uno personaje (tanto en Swift como en Unicode), que se compone de dos puntos de código (También conocido como escalares).¡No olvides que son diferentes!🙂


Ver también

Swift no te dice cuál es la representación interna de un String es.interactúas con un String como una lista de puntos de código Unicode de tamaño completo (32 bits):

for character in "Dog!🐶" {
    println(character)
}
// prints D, o, g, !, 🐶

Si desea trabajar con una cadena como una secuencia de puntos de código UTF-8 o UTF-16, utilice su utf8 o utf16 propiedades.Ver Cadenas y personajes en los documentos.

Con Swift 5, puedes iterar sobre el unicodeScalars propiedad de un carácter emoji de bandera para imprimir los valores escalares Unicode que lo componen:

let emoji: Character = "🇮🇹"
for scalar in emoji.unicodeScalars {
    print(scalar)
}
/*
 prints:
 🇮
 🇹
 */

Si combinas esos escalares (que son símbolos de indicadores regionales), obtienes un emoji de bandera:

let italianFlag = "🇮" + "🇹"
print(italianFlag) // prints: 🇮🇹
print(italianFlag.count) // prints: 1

Cada Unicode.Scalar la instancia también tiene una propiedad value que puedes usar para mostrar una representación numérica del mismo:

let emoji: Character = "🇮🇹"
for scalar in emoji.unicodeScalars {
    print(scalar.value)
}
/*
 prints:
 127470
 127481
 */

Puede crear escalares Unicode a partir de esas representaciones numéricas y luego asociarlos en una cadena:

let scalar1 = Unicode.Scalar(127470)
let scalar2 = Unicode.Scalar(127481)
let italianFlag = String(scalar1!) + String(scalar2!)
print(italianFlag) // prints: 🇮🇹
print(italianFlag.count) // prints: 1

Si es necesario, puede utilizar Unicode.Scalar's escaped(asASCII:) método para mostrar una representación de cadena de los escalares Unicode (usando caracteres ASCII):

let emoji: Character = "🇮🇹"
for scalar in emoji.unicodeScalars {
    print(scalar.escaped(asASCII: true))
}
/*
 prints:
 \u{0001F1EE}
 \u{0001F1F9}
 */
let italianFlag = "\u{0001F1EE}\u{0001F1F9}"
print(italianFlag) // prints: 🇮🇹
print(italianFlag.count) // prints: 1

String's init(_:radix:uppercase:) También puede ser relevante convertir el valor escalar a un valor hexadecimal:

let emoji: Character = "🇮🇹"
for scalar in emoji.unicodeScalars {
    print(String(scalar.value, radix: 16, uppercase: true))
}
/*
 prints:
 1F1EE
 1F1F9
 */
let italianFlag = "\u{1F1EE}\u{1F1F9}"
print(italianFlag) // prints: 🇮🇹
print(italianFlag.count) // prints: 1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top