Языки с письмом справа налево и Unicode-совместимость

В некоторых алфавитах, таких как латиница и деванагари, символы в горизонтальных строках отображаются слева направо. В других, например арабском или иврите, символы отображаются справа налево. Кроме того, текст может быть двунаправленным, когда в алфавите с письмом справа налево используются цифры, написанные слева направо, или тогда, когда в тексте есть слова из английского или других языков с направлением письма слева направо.

Если горизонтальное направление текста не является равномерным, возможны проблемы и неоднозначности. Для решения этого вопроса есть алгоритм определения направления в двунаправленном тексте Unicode. Двунаправленный алгоритм Unicode определяет набор правил, которые должны применяться приложением, чтобы обеспечить правильный порядок при отображении. Обычно его называют «алгоритмом двунаправленного отображения текста».

Алгоритм двунаправленного отображения текста

Алгоритм двунаправленного отображения текста описывает, как программное обеспечение должно обрабатывать текст, который содержит последовательности символов с написанием слева направо (LTR) и справа налево (RTL). Основное направление,14 назначенное фразе, будет определять порядок отображения текста. Последовательности символов могут отображаться слева направо или справа налево. В этом документе основное направление текста слева направо, поэтому все последовательности символов отображаются так, что первая находится слева от второй.

Чтобы узнать направление последовательности, слева направо или справа налево, каждому символу в Unicode присвоено соответствующее свойство направления. Большинство букв имеет строгую типизацию (символы со строгой типизацией) — LTR (слева направо) или RTL (справа налево) в зависимости от алфавита, в состав которого они входят. Последовательность строго типизированных символов RTL отображается справа налево. Это направление не зависит от окружающего базового направления. Например:

(LTR) пример — مثال (RTL).

В строке можно смешивать разнонаправленный текст. При этом алгоритм двунаправленного отображения выбирает отдельное направление для вывода каждой последовательности смежных символов с одинаковым направлением. У пробелов и большинства знаков препинания в Unicode нет строгого типа LTR или RTL, потому что они могут использоваться в любом алфавите. Поэтому они классифицируются как нейтральные символы или символы с нестрогой типизацией. Символы с нестрогой типизацией — это те, которые обычно используются в одном направлении, но в некоторых ситуациях могут использоваться в другом. Примеры таких символов:

  • Европейские цифры.
  • Арабские цифры.
  • Арифметические и валютные символы.
  • Общие для многих алфавитов знаки пунктуации, такие как двоеточие, запятая, точка и неразрывный пробел.

Направление нейтральных символов неопределимо в отсутствие контекста. Примеры:

  • Знаки табуляции.
  • Разделители абзацев.
  • Большинство других символов пробела.

Когда нейтральный символ находится между двумя строго типизированными символами с одинаковым направлением, ему также присваивается это направление. Например, нейтральный символ между двумя символами RTL будет обрабатываться как символ RTL, продолжая строку в этом направлении:

مثال. نطاق

Даже если между двумя строго типизированными символами есть несколько нейтральных символов, все они будут обрабатываться одинаково. Когда пробел или знак пунктуации встречается между двумя строго типизированными символами, имеющими разную направленность, нейтральные символы обрабатываются так, как если бы они имели преобладающее основное направление. Например:

example. مثال

Вспомните, что в этом документе основное направление последовательности символов слева направо, поэтому example — домен второго уровня, а ماثل — TLD. Если направление не переопределено, у чисел сначала всегда кодируются и вводятся цифры старшего разряда, и числа отображаются в направлении LTR. Нестрогая типизация направления распространяется только на все число целиком. Полная информация об алгоритме двунаправленного отображения содержится в Техническом отчете по Unicode № 9.

Правило двунаправленного отображения доменных имен

Двунаправленное доменное имя — это имя, которое содержит хотя бы одну метку RTL. Правило двунаправленного отображения доменных имен, сформулированное в RFC 5893, ограничивает коды символов в именах так, чтобы не было двух имен, которые представляют собой разные последовательности кодов, но отображаются одинаково из-за правил двунаправленного отображения.