Почему в начале начинается трейлинг-знак препинания: rtl?

Это скорее своего рода любопытство. Во время работы над многоязычным веб-приложением я заметил, что некоторые символы, такие как знаки препинания (!?.;) В конце элемента блока, отображаются так, как если бы они были помещены в начале вместо этого, когда направление записи справа налево (как это имеет место для некоторых азиатских языков, я не говорю).

Другими словами, строка

Hello, World!

отображается как

!Hello, World

при размещении в блоке div с помощью direction: rtl

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

http://jsfiddle.net/22Qk9/

В чем смысл этого поведения? Я предполагаю, что это должна быть особенность (всех?) Языков справа налево, которая автоматически обрабатывается браузером, поэтому мне не нужно заботиться об этом, или я должен?

Ответ 1

Причина в том, что восклицательный знак "!" имеет класс BiDi ON ("Другие нейтральные"), что означает, что он эффективно адаптируется к направленности окружающего текста. В этом примере он размещается слева от текста перед ним. Это совершенно верно для языков, написанных справа налево: завершающий знак пунктуации появляется в конце, то есть слева.

Обычно вы используете direction: rtl кода CSS direction: rtl или, предпочтительно, атрибут HTML dir=rtl для текстов на языке, написанном справа налево, и только для них. Для них это поведение - решение, а не проблема.

Если вместо этого вы используете direction: rtl или dir=rtl только для специальных эффектов, например, для создания столбцов таблицы, расположенных справа налево, то вам нужно учесть последствия. Например, в случае таблицы вам нужно будет установить направление ltr для каждой ячейки таблицы (если вы не хотите, чтобы они отображались как текст справа налево).

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

<blockquote dir=ltr>Hello, World!</blockquote>

Аналогичный случай (только с арабским языком в английском тексте) обсуждаются в случае использования 6 в документе W3C Что вам нужно знать об алгоритме биди и инлайн разметке (который имеет несколько странностей, хотя, как с помощью cite разметку для текста в кавычках, против рекомендаций W3C).

Ответ 3

Принятый ответ fooobar.com/questions/448158/... работает, если вы можете контролировать разметку /CSS значения, если у вас нет контроля над HTML, может сработать следующий подход.

Если вы не знаете, будет ли страница отображаться в формате RTL или LTR, но некоторый текст определенно является LTR (т.е. только на английском языке), вы можете заключить значение в метки LRE/PDF, чтобы указать, что это регион LTR. Текст будет отображаться LTR независимо от направления LTR или RTL страницы.

Это работает, когда у вас есть код, который пытается отобразить текст без возможности изменить разметку того, как именно он будет отображаться на странице. Т.е. вы отображаете значение для поля "song song" или "company name" в некотором вложенном дочернем компоненте (или на стороне сервера) без возможности управления окружающими элементами HTML.

Одним из недостатков этого и аналогичных подходов (например, предложение LRM в этом вопросе) с добавлением меток к тексту является копирование-вставка такого значения с результирующей HTML-страницы, как правило, сохраняет метки, но они не видны/нулевой ширины. Хотя в большинстве случаев хорошо подумать, если это проблема для вас.

Примерный пример кода (в некоторых компаниях в конце стоит "Inc.", который в конце будет отображаться с точкой в конце при отображении "как есть" на странице RTL):

 // comanyName = "Alphabet Inc." - really likes dot at the end including RTL
 if(stringIsDefinitelyAscii(companyName))
 {
     companyName = "\u202A" + companyName + "\u202C"
 }
 return companyName;

Подробности о символах LRE/PDF можно найти в https://unicode.org/reports/tr9/#Explicit_Directional_Embeddings:

LRE U + 202A ВСТАВКА С ЛЕВОГО ПРАВА Рассматривайте следующий текст как встроенный слева направо.

PDF U + 202C POP НАПРАВЛЕНИЕ ФОРМИРОВАНИЯ Завершите область действия последнего LRE, RLE, RLO или LRO.

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

Ответ 4

Это просто предположение, почему это произойдет.

Я предполагаю, что свойство direction: rtl добавляет явление "двунаправленности", где оно также влияет на пунктуацию. Это используется для сценариев на арабском или иврите, где связанная пунктуация перемещается в начало строки.

источник: http://www.w3.org/TR/2013/WD-css-writing-modes-3-20131126/#text-direction

Но почему это слово в конце?

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

jsFiddle

Как вы видите, арабский текст вступает в силу


Итак, это потому, что оно первоначально предназначено для арабского, иврита или любого другого "смешанного языка", где он видел только последнюю пунктуацию как один из поддерживаемых UNICODES, где само слово не было одним из поддерживаемых язык UNICODE.