我正在尝试使用 PHPWord 创建一个 Word 文档,该文档将包含从 MySQL 数据库中提取的动态数据。数据库有 MySQL 字符集:UTF-8 Unicode (utf8)
MySQL 连接整理:utf8_unicode_ci 表字段也是如此。

数据在 HTML 中可以很好地存储和预览,但是当使用阿拉伯变量创建文档时,Word 中的输出看起来像 أحÙد Ùبار٠اÙÙرÙ

$PHPWord = new PHPWord();
$document = $PHPWord->loadTemplate('templates/.../wtvr.docx');
$document->setValue('name', $name);
$document->setValue('overall_percent_100', $overall_percent_100);
$document->save('Individual Report - ' . $name . '.docx');

有没有办法解决这个问题?

最佳答案

嗯,是。但不幸的是,您必须修改库。该库的作者显然使用了 utf8_encode/utf8_decode,但根本不了解它们的作用。

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,如注释中所示。

为什么 utf8_encode/utf8_decode 错误?首先,因为那不是他们所做的。他们做 from_iso88591_to_utf8from_utf8_to_iso88591 。其次,ISO-8859-1 几乎从未使用过,通常当有人声称他们使用它时,他们实际上使用的是 Windows-1252。 ISO-8859-1 是一个非常小的字符集,甚至无法编码 ,更不用说阿拉伯字母了。

您可以通过执行以下操作对库进行快速审查:
$ grep -rn "utf8_\(en\|de\)code" .

如果你得到匹配,你应该继续寻找其他图书馆。这些函数每次都会做错事,即使有人需要一些边缘情况来使用这些函数,当您真正需要 ISO-8859-1 时,最好明确说明它,因为您通常从不这样做。

关于PHPWord:创建一个从右到左的阿拉伯语 word 文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13967229/

10-12 00:24
查看更多