问题中的字符串不会触发错误的显示顺序,除非用户名字符串中有控制字符,而是例如表单的消息
User (N badges) wrote:
如果将 User 替换为阿拉伯字母的名称,例如 أحمد,并且 N 替换为数字,例如 3,则会这样做。然后呈现将是
أحمد (3个徽章) 说:
从技术上讲,这不是错误。它遵循 Unicode 双向性规则——阿拉伯字母的强从右到左 (RTL) 方向性会影响方向性较弱的字符,如括号。但从实际角度来看,这当然都是错误的。在通常从左到右的上下文中,任何可能包含 RTL 字符的字符串都应该受到保护和隔离。在 HTML 文档中,有三种方法可以做到这一点:
- 字符级:在字符串之前使用控制字符 U+202B(从右到左嵌入,RLE),在字符串之后使用 U+202C(流行方向格式化,PDF)。在 HTML 中,您可以为它们使用
‫
和‬
。IE 9 支持此功能,但大多数其他浏览器不支持。
- 标记级别:使用
<bdi>
标记。如前所述,浏览器尚不支持它。
- 样式表:使用
unicode-bidi: embed
. 现代浏览器通常支持这一点。
您可以将样式表方法与标记方法结合起来。这样做是合乎逻辑的,在未来的浏览器中,即使禁用样式表,这种双重方法也可以工作:
<script>
document.createElement('bdi');
</script>
<style>
bdi { unicode-bidi: bidi-override; }
</style>
...
<bdi>أحمد</bdi> (3 badges) wrote:
脚本代码用于使旧版本的 IE 识别该<bdi>
元素,以便样式对其生效。当脚本被禁用时,这当然会失败,所以<span>
与类一起使用会稍微安全一些,你仍然可以将它包装在<bdi>
. 所以另一种选择是
<style>
.bdi { unicode-bidi: bidi-override; }
</style>
...
<bdi><span class=bdi>أحمد</span></bdi> (3 badges) wrote: