Сколько же еще казалось бы банальных вопросов, которые буквально постоянно у нас на глазах. Однако, ответы на них мы никогда не пытались найти потому что не замечали этого вопроса - привыкли к нему. А ведь зачастую такие вопросы скрывают интересные, глубокие и иногда просто изящные ответы.

Задумывались ли вы когда-нибудь, почему еврейская и арабская письменность имеют одну явную особенность, а именно написание справа налево? Оказывается, тому есть вполне практичное объяснение.

Семитские языки, в число которых входит и арабский, и иврит, одни из древнейших на планете. Они зарождались в то время, когда никто даже и мечтать не мог о бумаге, ведь она появилась лишь в около двух тысяч лет назад. Еврейская и арабская письменность возникла на основе древневавилонского клинописного письма, а западная традиция письма — из древнеегипетского папирусного письма.

Чтобы объяснить наглядно, в чем же между ними отличие, включим воображение. Представьте, что перед вами лежит папирус, а в руках у вас стило (тонкий ножичек). Мы нарезаем иероглифы правой рукой (85% людей — правши). При этом, то, что написано справа от нас, закрыто, зато прекрасно видно то, что слева. Возникает вопрос: как вам удобнее писать? Конечно, слева направо, поскольку так удобно видеть, что уже написано.


А теперь возьмите в руки камень, молоток и зубило. Молоток в правую руку (85%), зубило — в левую. Начнем высекать клинописные иероглифы. Левая рука с зубилом нам надежно закрывает то, что написано слева, зато то, что справа, нам хорошо видно. Как нам удобнее писать? В этом случае - справа налево.


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

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

Согласны с такой версией?

Задумывались ли вы когда-нибудь, почему еврейская и арабская письменность имеют одну явную особенность, а именно написание справа налево? Оказывается, тому есть вполне практичное объяснение.

Дело в том, что еврейская и арабская письменность возникла на основе древневавилонского клинописного письма, а западная традиция письма - из древнеегипетского папирусного письма.

Чтобы объяснить наглядно, в чем же между ними отличие, включим воображение. Представьте, что перед вами лежит папирус, а в руках у вас стило (тонкий ножичек). Мы нарезаем иероглифы правой рукой (85% людей - правши). При этом, то, что написано справа от нас, закрыто, зато прекрасно видно то, что слева. Возникает вопрос: как вам удобнее писать? Конечно, слева направо, поскольку так удобно видеть, что уже написано.

А теперь воьмите в руки камень, молоток и зубило. Молоток в правую руку (85%), зубило - в левую. Начнем высекать клинописные иероглифы. Левая рука с зубилом нам надежно закрывает то, что написано слева, зато то, что справа, нам хорошо видно. Как нам удобнее писать? В этом случае справа налево.

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

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

Помню, когда я в детстве впервые узнал, что некоторые народы, например, арабы и евреи, пишут справа налево, то очень удивился. Мне казалось непонятным, как так можно писать. Ведь это же страшно неудобно!

Я даже попробовал написать что-то в обратном направлении, но почти сразу же всё размазал рукой, которой держал ручку.

На мои вопросы, почему же евреи с арабами пишут именно так, никто не дал вразумительного ответа. Поэтому долгое время мне оставалось довольствоваться объяснением, что у них просто так принято.

Тем не менее ответ на эту загадку не давал мне покоя, даже когда я вырос. Мне казалось, что должна быть веская причина для того, чтобы писать в «неправильном» направлении. И в конце концов выяснилось, что это действительно так!


Оказалось, что всё объясняется довольно просто и логично. Дело в том, что семитские языки, в число которых входит и арабский, и иврит, одни из древнейших на планете. Они зарождались в то время, когда никто даже и мечтать не мог о бумаге, ведь она появилась лишь в около двух тысяч лет назад.


Тем не мене людям нужно было как-то фиксировать информацию, поэтому они высекали письмена на камне. А теперь представим, как правшам, которых на земле 85 %, будет удобнее орудовать молотком и зубилом? Конечно же, это сподручнее делать, держа зубило в левой руке и стуча по нему молотком, зажатым в правой. А в этом случае удобнее всего писать как раз справа налево!


Кстати, присмотрись внимательнее к буквам еврейского алфавита. Их своеобразная конфигурация свидетельствует о том, что изначально буквы высекались на чем-то твердом. Такие буквы гораздо проще изобразить зубилом, а не пером.


Хотя с тех пор камень перестал быть единственным долговечным хранителем информации, но правила письма уже сформировались, так что никто не стал их кардинально менять.


Вот так просто объясняется загадка о направлении письма в иврите и арабском языке. Если это стало для тебя открытием, обязательно поделись своими новыми знаниями со своими друзьями.

  1. Для каждого символа в строке вычисляется направленность;
  2. Строка бьётся на блоки одинаковой направленности;
  3. Блоки выстраиваются в порядке, заданном базовым направлением.

На направленность каждого символа влияет его тип и направленность соседних символов.

Три типа символов

1) Сильно направленные (или строго типизированные, strongly typed) - например, буквы. Их направленность заранее определена - для большинства символов это LTR, для арабских и иврита - RTL.


Слова на картинке целиком строго типизированы:



2) Нейтральные - например, знаки пунктуации или пробелы. Их направленность не задана явно, они направлены так же, как соседние сильно направленные символы .


Запятая между направленными слева направо «o» и «w» в строке «Hello, world» принимает их направленность и при базовом LTR, и при RTL:



Но что, если нейтрально направленный символ попадает между двумя сильно направленными символами разной направленности? Такой символ принимает базовую направленность.


Вот тут расположение «++» в одном случае между однонаправленными «C» и «a», а в другом - между разнонаправленными «C» и арабским «و», приводит к разному результату:



То же самое случается с нейтральными символами в конце строки:



3) Слабо направленные (или слабо типизированные, weakly typed) - например, числа. Они имеют свою направленность, но никак не влияют на окружающие символы.


Непрерывные слова из цифр выстраиваются слева направо, но два числа подряд, разделённые нейтральным символом, будут идти друг за другом справа налево, если задана базовая RTL–направленность:



Ещё более наглядный случай - число, в котором разряды разделены пробелом:



При этом допускается разделять числа точкой, запятой, двоеточием - эти разделители тоже слабо направлены (подробнее можно посмотреть в спецификации):


Направленные блоки (directional run)

Последовательные символы одинаковой направленности объединяются в блоки (directional run). Эти блоки выстраиваются друг за другом в порядке, определённым базовым направлением:



Слабо направленные числа, несмотря на то, что имеют свою направленность, не влияют на формирование блоков, что может приводить к такому результату - они продолжают предыдущий направленный блок:


Зеркальные символы

Некоторые символы в разных контекстах имеют разную форму - например, открывающая скобка в RTL будет выглядеть как закрывающая в LTR (что логично, ведь контент в скобках будет идти после - то есть, слева от неё).


В большинстве случаев это не создаёт проблем, но если скобки случайно окажутся разной направленности, визуально они будут смотреть в одну сторону. Например, если скобка висит в конце строки:


Берём порядок под контроль

Как мы увидели выше, часто текст по этим правилам форматируется не так, как нам хотелось бы.


В этом случае нам пригодятся инструменты для встраивания желаемого направления в существующий контекст или переопределения направлений конкретных символов.

Изоляция (isolate)

С заданием базового направления мы уже познакомились выше: это делает атрибут dir. Это глобальный атрибут , он применим к любому элементу.


dir создаёт новый уровень встраивания (embedding level) и изолирует содержимое от внешнего контекста. Контент внутри направлен согласно значению атрибута, а внешняя направленность самого контейнера становится нейтральной.


Явная установка атрибута dir позволяет избежать почти всех проблем форматирования смешанного текста:


أنا أحب C++ و Java


Если направленность контента неизвестна заранее, можно указать auto в качестве значения атрибута dir. Тогда направление содержимого определится с помощью «некоторой эвристики» - оно просто возьмётся у первого попавшегося строго типизированного символа.


{comment}


Аналогично работает тег и css-правило unicode-bidi: isolate:


Landmark: {name} - {distance}

Встраивание (embed)

Можно открыть новый уровень встраивания без изоляции - правило unicode-bidi: embed в комбинации с нужным значением правила direction определяют и направление внутри элемента, и его направленность снаружи. Но это на практике не нужно почти никогда.

Переопределение (override)

или unicode-bidi: bidi-override; direction: rtl . Переопределяет направление каждого символа внутри элемента. Нужно использовать крайне редко (например, если нужно поменять местами два конкретных символа) и не забывать изолировать дочерние элементы.


Hello, world!


При этом снаружи элемент трактуется как сильно направленный. Чтобы он вёл себя как isolate снаружи, но как bidi-override внутри, нужно использовать unicode-bidi: isolate-override .

Управляющие символы (marks)

Вставка управляющих символов - неприятный способ, но он полезен, когда у нас нет доступа к разметке, но есть доступ к контенту. Например, это могут быть просто невидимые сильно направленные символы, ‎ и ‏ (‎ / ‏ или \u200e / \u200f). Они помогают задать нужное направление нейтральному символу.


Например, в этом случае, чтобы восклицательный знак в конце строки принял направление LTR, нужно, чтобы он находился между двумя LTR символами:


Hello, world!‎

Также любая описанная выше логика реализуется через управляющие символы. Для изоляции - LRI/RLI, для переопределения - LRO/RLO, и т.д. - смотри подробное руководство по управляющим символам.

Поддержка браузерами

К сожалению, в IE тег , dir="auto" и соответствующие им правила CSS не поддерживаются. Кроме того, спецификация этих правил всё ещё на стадии Editor"s Draft.


Если нужен аналог dir="auto" , работающий в любом браузере, можно парсить контент регуляркой и выставлять атрибут dir самостоятельно. Но лучше, конечно, так не делать.

HTML или CSS?

Однозначно, управлять направлением текста по возможности нужно через HTML–атрибут dir и тег , а не через правила CSS. Направление текста - это не стилизация, это часть контента. Страница может быть вставлена через какой-нибудь instant view или быть прочитана через RSS–reader.

Перед заключением: немного боли

Мы познакомились с теорией. Но знание теории не освобождает от необходимости страдать.


Главная проблема, с которой я столкнулся на первых же минутах разработки под RTL–язык, это его чужеродность. Мы пишем код слева направо. Моя система, браузер и редактор работают слева направо, все наши внутренние продукты - слева направо. Поэтому, как только в это пространство попадает арабский язык, всё плохо и больно:

Манипуляции с текстом

Если символы на экране расположены не в том порядке, в каком они на самом деле располагаются в строке, что будет, если попытаться редактировать двунаправленный текст? Или хотя бы выделить и скопировать его часть?


Ничего хорошего. Попробуйте сами:


Landmarks: دبي مارينا مول - 600 m, داماك العقارية - 1.2 km
a‮z‭b‮y‭c‮x‭d‮w‭e‮v‭f‮u‭g‮t‭h‮s‭i‮r‭j‮q‭k‮p‭l‮o‭m‮n‭

Манипуляции с кодом

И то же самое при правке кода в редакторе и код-ревью - боль.


Даже в порядке элементов в массиве нельзя быть уверенным:



Или того хуже, код вообще не выглядит валидным:



Теорий возникновения письма существует множество, но следует понимать, что ни одна из них не может считаться стопроцентно верной - речь идёт о процессах древностью несколько тысяч лет, о которых никаких письменных (простите за каламбур) свидетельств не сохранилось. То же можно сказать и о прочих «предысториях цивилизации»: мы никогда точно не узнаем, где жили первые индоевропейцы и как звучал их язык, кем были первые перешедшие Берингов пролив люди и в каком году впервые одомашнили собаку - мы можем лишь делать реконструкции и предположения разной степени обоснованности.

Тем не менее, сейчас большинство учёных связывает направление письма с типом изначально применявшихся писчих приспособлений. Здесь есть два основных варианта.

    Текст пишется каким-то напоминающим современную ручку приспособлением (стилусом, заострённой трубочкой и т.п.) на мягкой поверхности, при этом либо по этой поверхности распределяется красящее вещество (тушь, чернила и др. по бумаге, папирусу и др.), либо знаки на этой поверхности выдавливаются/процарапываются, но без особых усилий (воск, берёста, мягкая глина и т.п.). При таком способе письма инструмент удобнее всего держать в правой руке (более 90% людей правши) наиболее развитыми пальцами (указательным, средним и большим). В таком случае письмо слева направо оказывается гораздо органичнее, ибо, во-первых, рука пишущего не закрывает уже написанное и с ним можно постоянно сверяться, во-вторых, при использовании красящего вещества нет риска смазать его рукой или рукавом.

    Текст высекается на твёрдой поверхности (камень, дерево) с помощью режущего инструмента (долото и т.п.) и била (молоток и пр.). В таком случае молоток обычно держится правой рукой (>90% людей правши, и правая рука у них сильнее), а резец - левой; соответственно, «писать» удобнее справа налево, так как при этом молоток не мешает обзору выбиваемого в данный момент знака.

Основным способом письма в большинстве человеческих цивилизаций по понятным причинам являлся первый (мягкая поверхность + краска/процарапывание): это просто и не требует больших физических усилий. Поэтому большинство известных систем письменности используют письмо слева направо. Современные системы письма справа налево, видимо, имеют исторические корни во втором варианте, однако эти процессы столь удалены от нас во времени, что мы не можем утверждать наверняка, что дело было именно так.

Что касается других способов письма, то они являются производными от указанных. Восточное письмо сверху вниз - это то же письмо слева направо, развившееся вследствие того, что писчий материал свёртывали в постепенно разворачивавшиеся рулоны. Переднеазиатский бустрофедон (

тоже является вариантом письма слева направо, при котором поверхность (табличку) поворачивали на 180 градусов в конце каждой строки.