Tec*_*oso 4 php encoding utf-8 arabic phpword
我正在尝试使用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');
Run Code Online (Sandbox Code Playgroud)
反正有没有解决这个问题?
嗯,是.但不幸的是,您必须修改库.图书馆的作者utf8_encode/utf8_decode显然没有理解他们的所作所为.
在150号线上Shared/String.php:
更换
public static function IsUTF8($value = '') {
return utf8_encode(utf8_decode($value)) === $value;
}
Run Code Online (Sandbox Code Playgroud)
同
public static function IsUTF8($value = '') {
return mb_check_encoding($value, "UTF-8");
}
Run Code Online (Sandbox Code Playgroud)
然后,如果你这样做
$ grep -rn "utf8_encode" .
Run Code Online (Sandbox Code Playgroud)
在项目根目录中,您将找到所有使用的行utf8_encode.你会看到像这样的行
$linkSrc = utf8_encode($linkSrc); //$linkSrc = $linkSrc;
$givenText = utf8_encode($text); //$givenText = $text;
Run Code Online (Sandbox Code Playgroud)
您可以简单地删除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" .
Run Code Online (Sandbox Code Playgroud)
如果你得到匹配,你应该继续前进并寻找其他的库.这些函数每次都只是做错了,即使有人需要一些边缘情况来使用这些函数,当你真正需要ISO-8859-1时,最好明确它,因为你通常不会这样做.