我正在尝试使用 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_utf8
和 from_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/