在PHPWord模板中正确插入RTL文本

21
我将使用PHPWord模板处理器来插入一些文本到模板中。
这个word模板是LTR格式的,因为所有的标签都是英文的。
这是在word模板中的那一行:
User Name: ${name}

以下是替换值的 PHP 代码:

$template->setValue('name', $user->name);

这句话是双向的。标签是英语(LTR),用户名始终为阿拉伯语(RTL)。

在解压Word文件后,以下是document.xml中生成的代码行:

<w:r><w:rPr><w:b/><w:bCs/><w:lang w:val="en-US" w:bidi="ar-EG"/></w:rPr><w:t>User Name:</w:t></w:r><w:r><w:rPr><w:lang w:val="en-US" w:bidi="ar-EG"/></w:rPr><w:t xml:space="preserve"> عمرو هشام</w:t><w:tab/></w:r>

替换的文本在LibreOffice中正确地以RTL显示,但在Microsoft Word中以LTR(反向)显示。

我该怎么做才能使它在Microsoft Word中正确地(RTL)显示?


我认为第二个<w:rPr>之后应该有一个<w:rtl/>,但目前不存在。 - revo
可能这篇文章可以帮到你:http://stackoverflow.com/questions/14491325/fix-a-bi-lingual-wrong-right-to-left-text - MifReal
我猜你之前做过这个:https://dev59.com/AmzXa4cB1Zd3GeqPSVEE - morteza kavakebi
1个回答

1
你在一开始就犯了错误,试图修正PHPword以使用UTF-8字符串。根据this,有两种方法可以解决PHPword的问题,我尝试了两种方法。正确的方法是:

Shared/String.php的第150行:

替换

public static function IsUTF8($value = '') {
    return utf8_encode(utf8_decode($value)) === $value;
}

带有

public static function IsUTF8($value = '') {
    return mb_check_encoding($value, "UTF-8");
}

然后,如果您这样做
$ grep -rn "utf8_encode" .

在项目根目录中,您将找到所有使用utf8_encode的代码行。您会看到像这样的代码行。
$linkSrc = utf8_encode($linkSrc); //$linkSrc = $linkSrc;

$givenText = utf8_encode($text); //$givenText = $text;

您可以根据注释所示,简单地删除utf8_encode即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接