Подтвердить что ты не робот

Как решить проблемы с BiDi?

Как вы, возможно, знаете, некоторые языки пишутся/читаются справа налево, и мы пытаемся поддерживать некоторые языки RTL. Для веб-интерфейса использование dir = "rtl" в html делает большую часть работы благодаря алгоритмам, которые есть в браузерах. Но я сталкивался с этой проблемой в квадратных скобках:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Bracket problems with BiDi</title>
</head>
<body>

<p style="direction: rtl;">Bracket problem: hello (world):</p>
<p style="direction: rtl;">No bracket problem: hello (world) something:</p>
<p style="direction: rtl;">Bracket problem: (السلام (عليكم </p>
<p style="direction: rtl;">No bracket problem: السلام (عليكم) عليكم </p>

</body>
</html>

Проблему можно увидеть здесь:

enter image description here

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

4b9b3361

Ответ 1

Здесь много проблем. Согласно стандарту unicode, скобки являются нейтральными, то есть они по сути не рассматриваются как LTR или RTL. Они берут направление своего окружающего языка. В примерах, где он неправильно отображается, направление закрывающей скобки считается таким же, как на английском языке, то есть LTR.

Первая проблема: Вы указываете браузеру, что абзац должен рассматриваться как RTL. Браузер находит английский внутри, что является LTR, поэтому он считает, что английский встроен внутри абзаца RTL, а последний символ ")" рассматривается как RTL. (окружающий пункт RTL).

Вторая проблема: Здесь нет проблем, из простого взгляда на исходный код, который вы предоставили, похоже, вы правильно поставили скобки. Но на самом деле, закрывающая скобка, которая должна быть после текста RTL и до закрытия </P> на самом деле до исходного RTL-текста. Если вы наберете его правильно, это будет выглядеть неправильно (потому что используемый текстовый редактор предполагает, что конечная скобка LTR соответствует юникоду). Чтобы проверить это, скопируйте содержимое в свой редактор, поместите курсор в конец "проблемы:" и нажмите стрелку вправо несколько раз и посмотрите местоположение последнего скобки.

Не давая гораздо больше объяснений, вот несколько примеров, чтобы заставить это работать:

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Bracket problems with BiDi</title>
</head>

<body>
  <p style="direction: rtl;"><span dir="ltr">Bracket problem no more: hello (world):</span></p>
  <p style="direction: rtl;"><span style="direction: ltr; unicode-bidi: embed">Bracket problem no more: hello (world):</span></p>
  <p style="direction: rtl;">Bracket problem no more: السلام (عليكم)</p>

  <!-- style for p tag below is ltr by default -->
  <p>Bracket problem no more: <span dir="rtl">السلام (عليكم)</span></p>
  <p>Bracket problem no more: <span style="direction: rtl; unicode-bidi: embed">السلام (عليكم)</span></p>
</body>
</html>

Существуют различия в том, как style = "direction: ltr;" работы и dir = "ltr", поэтому я привел примеры того и другого. Кроме того, поскольку я предполагаю, что вам в основном нужно решить вашу вторую проблему, где вы, главным образом, имеете RTL-текст в другом документе LTR, я представил два последних примера.

ПРИМЕЧАНИЕ. Если два последних примера - это то, что вы ищете, и вы собираетесь использовать CSS, требуется свойство unicode-bidi, и это делает разницу между работой и неработоспособностью.

Ответ 2

Вам просто нужно добавить символ LRM после последней скобки. Объект HTML: &#x200E;

<html dir="rtl">
<body>
<p>hello (world)&#x200E;</p>
</body></html>

Это говорит браузеру интерпретировать скобки как показания слева направо.

Ответ 3

Ответ silkfield привел меня на эту страницу, которая показывает многие из возможных проблем с макетами BiDi, включая проблему скобок

enter image description here

Ответ 4

вы можете поместить следующий css для своей проблемы " unicode-bidi: embed" в теге body, он отлично работает