Apple ha estado teniendo algunos meses con errores. Ahora tenemos un error nuevo y grave en la funcionalidad de representación de texto en los iPhone. El error se desencadena por un solo carácter telugu que puede hacer que un iPhone entre en un bucle de arranque irrompible simplemente al recibir una notificación que contiene el carácter. Profundicemos en por qué un solo carácter puede causar problemas tan importantes con iOS.
Nota: Una solución para el error Telugu está disponible en la versión más reciente de iOS (11.2.6). Si el carácter telugu ha bloqueado su aplicación o dispositivo, restaure su iPhone a través de iTunes y actualice a la versión más reciente de iOS. Si su iPhone está atascado en un bucle de arranque, es posible que deba ponerlo en el Estado de actualización de firmware del dispositivo (DFU) para que iTunes lo reconozca. Cuando haya terminado, restaure su dispositivo desde su copia de seguridad más reciente, que con suerte creó.
¿Qué es el telugu?
El telugu es un idioma hablado y escrito en partes de la India, específicamente en los estados de Andhra Pradesh, Telangana y en la ciudad de Yanam. Al igual que muchos idiomas basados en escritura, como el árabe y otras escrituras brahmánicas, el telugu utiliza algunas características especiales del conjunto de caracteres Unicode para mostrar sus caracteres en la pantalla de una computadora.
Si bien la mayoría de las letras latinas están representadas por un solo punto de código Unicode de 8 bits para compatibilidad con ASCII (por ejemplo, la letra A existe en el punto de código Unicode U+0041
que se representa en binario por 01000001
), los idiomas escritos con escritura o letras no latinas suelen combinar más de un punto de código Unicode para representar sus caracteres.
Esto es especialmente cierto para los idiomas, como el telugu, que combinan las versiones de las letras de los idiomas en grupos. A diferencia de las ligaduras estilísticas del inglés, la conexión entre cada letra telugu es lingüísticamente importante. Para acomodar esto, Unicode incluye un sistema complejo de adjuntar caracteres, cada uno representado por su propio punto de código, entre sí.
Teniendo en cuenta la gran cantidad de puntos de código Unicode, esto puede crear una variedad casi infinita. Estos puntos se combinan para generar un carácter legible. De esta forma, Unicode no necesita un punto de código Unicode para literalmente todas las palabras telugu posibles. En cambio, Unicode combina consonantes, vocales y diacríticos telugu («virama») para crear palabras que se muestran como un solo carácter. Lo mismo se aplica a otros idiomas con reglas ortográficas para las ligaduras, como el árabe.
¿Qué causa el accidente?
El problema parece estar relacionado con Zero Width Non-Joiner (ZWNJ) en el punto de código U+200C
. El ZWNJ solicita que dos caracteres adyacentes se representen sin su ligadura típica. En inglés, un ZWNJ evita que los caracteres ff se impriman con su ligadura de conexión estándar, en lugar de separar cada f. Pero cuando se combina con un conjunto específico de cuatro puntos de código Telugu (todos los cuales deben combinarse en un solo grupo), por alguna razón, iOS no puede mostrar el resultado correctamente.
Algunos han especulado que la fuente San Francisco de Apple no puede mostrar el carácter, mientras que otros han dicho que el proceso de renderizado específico que usa Apple tiene la culpa. Cualquiera que sea la causa exacta, el intento de renderizar el personaje provoca un colapso dramático de lo que sea que lo esté renderizando, desde Mensajes y WhatsApp hasta Springboard. Los puntos de código Unicode que componen el carácter («gya» que significa «conocimiento») se encuentran a continuación:
Pero ni siquiera podemos culpar solo a Zero Width Non-Joiner (ZWNJ). También se usa en los emojis familiares inocuos (????) sin ningún problema. Parece ser una combinación específica de algunos puntos de código específicos y el ZWNJ. Para colmo de males, parece que el ZWNJ no tiene un efecto particular en la representación en este grupo Telugu o que ni siquiera debería estar allí en primer lugar.
Otros problemas con la escritura brahmánica
Sin embargo, el telugu no es el único idioma con este problema. Bengali y Devanagari, que usan Unicode de manera similar para sus scripts Brahmic, tienen el mismo problema. Manish Goregaokar escribe una publicación de blog fascinante y detallada que explica aún más el caso exacto del accidente:
Cualquier secuencia <consonant1, virama, consonant2, ZWNJ, vowel>
en devanagari, bengalí y telugu, donde:
1. consonant2
es unión de sufijos (pstf
/vatu
)
2. consonant1
no es una letra formadora de ref
3. vowel
no tiene dos componentes de glifo
Conclusión: ¿Por qué Apple no lo atrapó?
Para entender cómo pasó este error, debes ponerte en los zapatos de Apple. Claro, esta combinación de caracteres no es una palabra súper oscura en el idioma telugu. Pero el iPhone incluye soporte para docenas de idiomas. Hay literalmente miles de millones de combinaciones potenciales en Unicode. Con tanta variedad, las pruebas significativas de errores de Unicode antes de un lanzamiento harían que las actualizaciones regulares de software fueran básicamente imposibles.
Sin embargo, el error no debería haber causado tanto daño. Los teléfonos no deberían bloquearse en función del contenido de un mensaje de texto. Si bien la retrospectiva seguramente es 20/20, parece que representar al personaje como un cuadro de signo de interrogación (�) hubiera sido mejor que bloquear Springboard.