Por qué un personaje de Telugu está ladrando dispositivos de Apple

Apple ha estado teniendo un buggy unos meses. Ahora tenemos un nuevo y serio error en la funcionalidad de renderizado de texto en los iPhones. El fallo es provocado por un único personaje de Telugu que puede hacer que un iPhone entre en un bucle de arranque irrompible con sólo recibir una notificación que contenga el personaje. Analicemos por qué un solo carácter puede causar problemas tan importantes con iOS.

Nota: Existe una corrección para el error de Telugu en la versión más reciente de iOS (11.2.6) . Si el personaje Telugu ha bloqueado tu aplicación o dispositivo, restaura tu iPhone a través de iTunes y actualiza a la versión más reciente de iOS. Si tu iPhone está atascado en un bucle de arranque, es posible que tengas que ponerlo en el estado Device Firmware Update (DFU) para que iTunes lo reconozca. Cuando haya terminado, restaure el dispositivo a partir de la copia de seguridad más reciente que haya creado.

¿Qué es Telugu?

El telugu es una lengua hablada y escrita en partes de la India, específicamente en los estados de Andhra Pradesh, Telangana y en la ciudad de Yanam. Al igual que muchos lenguajes basados en scripts, como el árabe y otros scripts brahmicos, Telugu utiliza algunas características especiales del juego de caracteres Unicode para mostrar sus caracteres en la pantalla de una computadora.

Mientras que la mayoría de las letras latinas están representadas por un único punto de código Unicode de 8 bits para compatibilidad ASCII (por ejemplo, la letra A existe en el punto de código Unicode U+0041, que está representado en binario por 01000001), los idiomas escritos con letras alfabéticas o no latinas suelen combinar más de un punto de código Unicode para representar sus caracteres.

Esto es especialmente cierto en el caso de las lenguas, como el telugu, que combina las versiones de las letras de las lenguas 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 complejo sistema de adjuntar caracteres, cada uno representado por su propio punto de código, el uno al otro.

Considerando el gran número de puntos de código Unicode, esto puede crear una variedad casi infinita. Estos puntos se combinan para dar un carácter legible. De esta manera, Unicode no necesita un punto de código Unicode para cada palabra Telugu posible. En cambio, Unicode combina consonantes Telugu, vocales y diacríticos («virama») para crear palabras que se muestran como un solo carácter. Lo mismo se aplica a otras lenguas con reglas ortográficas para ligaduras, como el árabe.

¿Qué causa el choque?

El problema parece estar relacionado con el Zero Width Non-Joiner (ZWNJ) en el punto de código U+200C. El ZWNJ solicita que dos caracteres adyacentes se muestren sin su ligadura típica. En inglés, un ZWNJ evita que los caracteres ? se impriman con su ligadura de conexión estándar, en lugar de separar cada f. Pero cuando se combinan con un conjunto específico de cuatro puntos de código Telugu (todos los cuales deben combinarse en un solo cluster), 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 utiliza Apple es el culpable . Cualquiera que sea la causa exacta, el intento de renderizar el personaje provoca una caída dramática de lo 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») están abajo:

  • U+0C1C ja ( )
  • U+0C4D un virama, o marca diacrítica ( )
  • U+0C1E nya ( )
  • U+200C sin uniones de anchura cero
  • U+0C3E aa ( )

Pero ni siquiera podemos culpar a Zero Width Non-Joiner (ZWNJ) solo. También se utiliza 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 la ZWNJ. Añadiendo un insulto a la lesión, parece que el ZWNJ no tiene ningún efecto particular en el renderizado de este grupo de Telugu o que ni siquiera debería estar allí en primer lugar.

Otros problemas de escritura brahmica

Sin embargo, el telugu no es el único idioma con este problema. Bengali y Devanagari, que utilizan Unicode de forma similar para sus escrituras brahmicas, tienen el mismo problema. Manish Goregaokar escribe una entrada de blog rápida y detallada que resuelve el caso exacto de la caída aún más:

Cualquier secuencia en Devanagari, Bengalí, y Telugu, donde:

1. consonante2 es sufijo-unión (pstf/vatu)

2. la consonante1 no es una letra reformuladora

3. La vocal no tiene dos componentes de glifo

Conclusión: ¿Por qué no fue capturado por Apple?

Para entender cómo llegó este bicho, tienes que ponerte en el lugar 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 para detectar errores de Unicode antes de una versión 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 deben bloquearse en función del contenido de un mensaje de texto. Si bien la retrospectiva es seguramente 20/20, parece que renderizar el personaje como un signo de interrogación (?) hubiera sido mejor que estrellar el trampolín.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *