¿Cómo se representa el carácter 🇩🇪 en cadenas Swift?
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?
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