unicodeToList
Divide una cadena en los caracteres que percibe el usuario, tratando correctamente los pares subrogados.
Lección
En Dart, un String es una secuencia de unidades de código
UTF-16, no de caracteres. Llamar a s.split('') divide por unidad
de código — algo correcto para texto ASCII/latino sencillo, pero erróneo para
cualquier cosa fuera del Plano Multilingüe Básico, como la mayoría de los
emoji: estos se representan con un par subrogado (dos
unidades de código), así que una división ingenua parte un mismo emoji en dos
mitades rotas.
unicodeToList lo resuelve iterando los .runes de la
cadena — los puntos de código Unicode — y convirtiendo cada uno de vuelta en
su propio String de un solo carácter. El resultado es la lista de
caracteres que una persona ve realmente al leer la cadena, igual que el
unicodeToList de FxTS, que divide por punto de código y no por
unidad UTF-16.
Demo 1 · División ingenua frente a unicodeToList
Demo 2 · Invertir y contar correctamente
Partiendo de unicodeToList: una inversión con división ingenua
destrozaría el emoji; esta no:
Pruébalo tú
Ejercicio: cuenta cuántos caracteres percibidos por el usuario hay en esta cadena (contiene un emoji).