打印RTL文本后PHP没有重置为LTR文本?

时间:2013-03-29 17:56:27

标签: php right-to-left

我需要在LTR页面上内联显示一些RTL文本。

我将国家/地区名称以英文名称(LocalLanguageName)格式存储在MySQL数据库的单个字段中。当本地语言是RTL文本时,我的PHP创建的输出就会被破坏。

例如,以色列存储在数据库中:

Israel (ישר×ל)

我的PHP代码是:

print "<li>$row[Country], ";
print date('jS M Y',strtotime($row[StartDate]));
print "</li>\n";

哪个输出:

<li>Israel (ישראל), 1st Jan 2013</li>

如果我删除了日期行,则右括号和逗号位于正确的位置。

如果我把"x".放在我得到预期的日期之前:

<li>Israel (ישראל), x1st Jan 2013</li>

dir="LTR"添加到<li>元素不起作用,因为输出html不正确。

如何获得<li>LTR name (RTL name), date</li>的输出?

由于

2 个答案:

答案 0 :(得分:1)

它与PHP没什么关系,但是使用HTML和Unicode双向算法。您似乎总是在国家/地区名称后面添加一个数字,并且该算法对与具有不同方向性的单词相邻的数字进行了一些魔术。有时候这种魔法很有用,有时却没有。

如果您的一般环境主要是英语,那么最简单的方法就是添加HTML实体&amp; lrm;在国名后的括号后面。你甚至不需要条件而且你可以在所有的国名之后这样做 - 它在从左到右的国家名称后不会受到伤害。

更优雅的方法是将国家/地区名称(包括括号中的部分)放在HTML标记&lt; bdi&gt;中。这意味着&#34;双向隔离&#34 ;;简单来说,它就像一个&lt; span&gt;标签,但它以一种阻止答案开头提到的双向魔法的方式隔离其内容。虽然它更优雅,但这种方法有一个缺点:它不能在Microsoft Internet Explorer中工作(看到它?)。如果您不太关心Microsoft Internet Explorer,我建议使用&lt; bdi&gt ;.

答案 1 :(得分:0)

阿拉伯字符将解析器设置为RTL模式,忽略标点符号,英文字母表中的字母触发解析器返回LTR模式(这就是为什么添加OP {'修复'中提到的x字符的原因输出),但数字仍然被认为是RTL,因此日期的数字仍然被认为是RTL字符串的一部分,标点符号),也被它们捕获。

您可以使用UTF-8从左到右标记强制解析器重新进入LTR模式:

print "<li>$row[Country]\xe2\x80\x8e, ";

结果是:

<li>Israel (ישראל)‎, 1st Jan 2013</li>