Двунаправленный текст, разрушающий макет - PullRequest
1 голос
/ 27 августа 2011

На моем веб-сайте есть заголовок, который должен отображать "Welcome username ."+ 202E - это символ переопределения справа налево, или RLO), все разрывы макета.

Вместо отображения «Welcome emanresu .» Отображается «Welcome. emanresu"или". emanresu Welcome "или тому подобное.Я попытался добавить символ U + 202C (направленное форматирование или PDF) после имени пользователя, и это сработало.Например:

<span>Welcome <?php echo $username; ?>&#x202c;.</span>

Но если имя пользователя содержит более одного символа RLO, оно снова ломается.Поэтому я должен сопоставить символы RLO с символами PDF, но я не уверен, как это сделать.И в соответствии со спецификациями W3C для этого нет решения .Я что-то здесь упускаю?

Ответы [ 4 ]

2 голосов
/ 27 августа 2011

Вам может быть интересен тег HTML5 <bdi>.

Подробности: http://rishida.net/blog/?p=564

1 голос
/ 27 августа 2011

Почему бы не найти этот символ в $ username и, если он найден, заменить <span> на <span dir="rtl">.Также замените эти символы пустыми в $ username

0 голосов
/ 28 августа 2011

Решение W3C состоит в том, что вы должны отфильтровывать RLO и другие символы из группы, известной как « Не подходит для использования в разметке ».

Делайте это одновременно с фильтрацией других нежелательных управляющих кодов, таких как ASCII 0x00–0x1F (возможно, включая или исключая символ новой строки) и 0x7F-0x9F. См. этот вопрос для фона.

(Вы также должны использовать echo htmlspecialchars($username);. Возможно, ваши имена пользователей не могут содержать < или &, но это не очень хорошая идея, чтобы полагаться на этапе вывода. Привыкайте вызывать htmlspecialchars во всем это само собой разумеющееся, назовите для него ярлык, если это необходимо.)

0 голосов
/ 27 августа 2011

Понимание двунаправленного текста (BIDI) в Unicode

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

...