У Apple несколько месяцев были проблемы. Теперь у нас есть новая серьезная ошибка в функции рендеринга текста на iPhone. Ошибка вызывается одним символом телугу, который может привести к тому, что iPhone войдет в неразрывный цикл загрузки, просто получив уведомление, содержащее этот символ. Давайте углубимся в то, почему один символ может вызвать такие серьезные проблемы в iOS.
Примечание. Исправление ошибки телугу доступно в самой последней версии iOS (11.2.6) . Если персонаж на телугу заблокировал ваше приложение или устройство, восстановите свой iPhone через iTunes и обновите iOS до последней версии. Если ваш iPhone застрял в цикле загрузки, возможно, вам придется поместить его в Состояние обновления прошивки устройства (DFU) , чтобы iTunes распознал его. По завершении восстановите свое устройство из последней резервной копии, которую вы, надеюсь, создали.
Что такое телугу?
Телугу — это язык, на котором говорят и пишут в некоторых частях Индии, в частности в штатах Андхра-Прадеш, Телангана и в городе Янам. Как и во многих алфавитных языках, таких как арабский и другие брахмические алфавиты, телугу использует некоторые особенности набора символов Юникода для отображения символов на экране компьютера.
Хотя большинство латинских букв представлены одним 8-битным кодом Юникода для совместимости с ASCII (например, буква A существует в коде Юникода U+0041
,
Contents
Что такое телугу?
м формате01000001
), языки, написанные рукописными или нелатинскими буквами, обычно объединяют более одной кодовой точки Unicode для представления своих символов.
Это особенно актуально для таких языков, как телугу, в которых версии букв разных языков объединены в кластеры. В отличие от стилистических лигатур английского языка, связь между каждой буквой телугу лингвистически важна. Чтобы обеспечить это, в Unicode предусмотрена сложная система присоединения символов, каждый из которых представлен собственной кодовой точкой, друг к другу.
Учитывая огромное количество кодовых точек Юникода, это может создать почти бесконечное разнообразие. Эти точки объединяются, чтобы создать разборчивый символ. Таким образом, Unicode не требует кодовой точки Unicode буквально для каждого возможного слова на телугу. Вместо этого Unicode объединяет согласные, гласные и диакритические знаки телугу («вирама») вместе, чтобы создать слова, которые отображаются как один символ. То же самое относится и к другим языкам с орфографическими правилами для лигатур, например к арабскому.
Что вызывает сбой?
Похоже, проблема связана с необъединителем нулевой ширины (ZWNJ) в кодовой точке U+200C
. ZWNJ требует, чтобы два соседних символа отображались без их типичной лигатуры. В английском языке ZWNJ не позволяет печатать символы ff с помощью стандартной соединительной лигатуры, вместо этого разделяя каждую букву f. Но в сочетании с определенным набором из четырех кодовых точек телугу (все они должны быть объединены в один кластер) iOS по какой-то причине не может правильно отобразить результат.
Некоторые полагают, что шрифт Apple San Francisco не может отображать этот символ, другие утверждают, что виноват конкретный процесс рендеринга, который использует Apple . Какой бы ни была точная причина, попытка рендеринга персонажа приводит к резкому сбою всего, что его рендерит, от сообщений и WhatsApp до Springboard. Коды Юникода, составляющие этот символ («гья», что означает «знание»), приведены ниже:
U+0C1C
да ()U+0C4D
вирама или диакритический знак ()U+0C1E
ня ()U+200C
несоединяющихся элементов нулевой ширины.U+0C3E
а.а. ( Что вызывает сбой?сонаж-сбой-ios-aa">)
Но мы не можем винить в этом даже Zero Width Non-Joiner (ZWNJ). Он также без каких-либо проблем используется в безобидных семейных смайликах (????). Похоже, это определенная комбинация некоторых конкретных кодовых точек и ZWNJ. Еще больше оскорбляет то, что ZWNJ либо не оказывает особого влияния на рендеринг в этом кластере телугу, либо его там вообще не должно быть.
Другие проблемы брахмического письма
Однако телугу — не единственный язык, с которым связана эта проблема. Бенгальский язык и деванагари, которые аналогичным образом используют Unicode для своих брахмических сценариев, сталкиваются с той же проблемой. Маниш Горегаокар пишет увлекательную и подробную публикацию в блоге, в которой еще более детально раскрывает конкретный случай аварии:
Любая последовательность
<consonant1, virama, consonant2, ZWNJ, vowel>
на деванагари, бенгали и телугу, где:1.
consonant2
— соединение суффиксов (pstf
/vatu
)
2.consonant1
не является рефобразующей буквой
3.vowel
не содержит двух компонентов глифа
Вывод: почему Apple не заметила этого?
Чтобы понять, как появилась эта ошибка, нужно поставить себя на место Apple. Конечно, эта комбинация символов — не какое-то непонятное слово на телугу. Но iPhone включает поддержку десятков языков. В Юникоде буквально миллиарды потенциальных комбинаций. При таком разнообразии полноценное тестирование ошибок Юникода перед выпуском сделает регулярные обновления программного обеспечения практически невозможными.
Однако ошибка не должна была причинить такой большой ущерб. Телефоны не должны блокироваться из-за содержания текстового сообщения. Хотя ретроспективный взгляд, безусловно, 20/20, похоже, что отрисовка персонажа в виде вопросительного знака (�) была бы лучше, чем сбой Springboard.