双向文本破坏布局

时间:2011-08-27 10:34:28

标签: php html layout unicode bidi

在我的网站上有一个标题,应显示“欢迎用户名。”。

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

问题是,如果用户将其名称更改为U + 202Eusername(其中U + 202E是从右到左的覆盖字符或RLO),则所有布局都会中断。

不显示“Welcome emanresu 。”,而是显示“Welcome。 emanresu ”或“。 emanresu Welcome”或类似的内容。我尝试在用户名之后添加U + 202C(流行方向格式或PDF)字符,并且它有效。像这样:

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

但是,如果用户名有多个RLO字符,则会再次中断。所以我应该做的是将RLO字符与PDF字符匹配,但我不知道如何做到这一点。根据W3C规范,没有解决方案。 我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:2)

您可能对HTML5代码<bdi>感兴趣。

详细信息:http://rishida.net/blog/?p=564

答案 1 :(得分:1)

为什么不在$ username中搜索此字符,如果找到,则将<span>更改为<span dir="rtl">。同样用$ username

中的空格替换这些字符

答案 2 :(得分:0)

Understanding Bidirectional (BIDI) Text in Unicode

这篇文章是关于比迪烟问题的一个非常有趣的一般读物,也有一个名为“过滤用户输入”的部分,接近结尾,似乎正在谈论你正在谈论的问题。

答案 3 :(得分:0)

W3C的解决方案是,你应该过滤出来自名为“Not suitable for use in markup”的群组中的RLO和其他角色。

在过滤掉其他不需要的控制代码(如ASCII 0x00-0x1F(可能包括或排除换行符)和0x7F-0x9F)的同时执行此操作。有关背景信息,请参阅this question

(您也应该使用echo htmlspecialchars($username);。也许您的用户名不能包含<&,但在输出阶段依赖这不是一个好主意。当然,在页面上的所有内容上调用htmlspecialchars;必要时为它定义一个快捷函数。)