unicodeToList

Divide una cadena en los caracteres que percibe el usuario, tratando correctamente los pares subrogados.

List<String> unicodeToList(String s)

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

Relacionado: split — divide con un iterable de caracteres normal · reverse — invierte un Iterable; con cadenas hay que cuidar igual los pares subrogados · countBy — usado arriba para contabilizar caracteres · identity — usado arriba como clave de conteo