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



我正在使用phpword模板处理器在模板中插入一些文本。

单词模板是格式的ltr,因为所有标签都是英语。

这是单词模板中的行:

User Name: ${name}

这是替换值的PHP线:

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

该句子是双向的。标签是英语(LTR),用户名总是阿拉伯语(RTL)。

这是document.xml中生成的代码行,在解开Word文件之后:

<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中?

您首先做了错误的操作,以纠正phpword与UTF-8字符串一起使用。
据此,有两种方法可以修复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,如注释中所示。

最新更新