Pensé que entendía bastante bien los escalares Unicode en Swift, pero el emoji con cara de perro me demostró que estaba equivocado.
for code in "🐶".utf16 { print(code) } Los códigos UTF-16 son 55357 y 56374 . En hexadecimal, eso es d83d y dc36 .
Ahora:
let dog = "\u{d83d}\u{dc36}"En lugar de obtener una cadena con "🐶", aparece un error:
Escalar Unicode no válido
Probé con códigos UTF-8 y tampoco funcionó. No arrojar un error, sino devolver "ð¶" en lugar de la cara de perro.
¿Que esta mal aquí?
La secuencia de escape \u{nnnn} espera un valor escalar Unicode , no la representación UTF-16 (con sustitutos altos y bajos):
for code in "🐶".unicodeScalars { print(String(code.value, radix: 16)) } // 1f436 let dog = "\u{1F436}" print(dog) // 🐶Las soluciones para reconstruir una cadena a partir de su representación UTF-16 se pueden encontrar en ¿Hay alguna manera de crear una cadena a partir de una matriz utf16 en Swift? . Por ejemplo:
let utf16: [UInt16] = [ 0xd83d, 0xdc36 ] let dog = String(utf16CodeUnits: utf16, count: utf16.count) print(dog) // 🐶