我有一个PHP脚本,它从MySQL数据库中读取信息,并使用模板将其放入DOCX文件中。在模板中,有一个名为<<<variable_name>>>
的占位符,其中variable_name
是MySQL字段的名称。
DOCX文件是Zip档案,因此我的PHP脚本使用ZipArchive库打开DOCX并编辑document.xml
文件,用正确的数据替换占位符。
直到今天,我遇到了一些编码问题。任何非ANSI字符都不能正确编码并使输出DOCX损坏。 MS Word提供错误消息“非法XML字符。”
当我解压缩文档并在记事本++中打开document.xml
时,我可以看到有问题的字符。通过转到编码菜单,然后选择“在ANSI中编码”,我可以正常看到字符:它们是磅(£)符号。当N ++设置为“以UTF-8编码时,它们显示为十六进制值。
通过选择“转换为UTF-8”的N ++选项,UTF-8中的字符显示为OK,MS Word完全打开文档。但我不想在每次创建内容时手动解压缩我的DOCX存档 - 脚本的重点是使文档生成简单快捷。
显然我需要PHP脚本以UTF-8输出文件,以使“£”字符正确显示。
我的代码(从SO上的另一个问题部分复制):
if (!copy($source, $target)) // make a duplicate so we dont overwrite the template
print "Could not duplicate template.\n";
$zip = new ZipArchive();
if ($zip->open($target, ZIPARCHIVE::CHECKCONS) !== TRUE)
print "Source is not a docx.\n";
$content_file = substr($source, -4) == '.odt' ? 'content.xml' : 'word/document.xml';
$file_contents = $zip->getFromName($content_file);
// Code here to process the file, get list of substitutions to make
foreach ($matches[0] as $x => $variable)
{
$find[$x] = '/' . $matches[0][$x] . '/';
$replace[$x] = $$matches[1][$x];<br>\n";
}
$file_contents = preg_replace($find, $replace, $file_contents, -1, $count);
$zip->deleteName($content_file);
$zip->addFromString($content_file, $file_contents);
$zip->close();
chmod($target, 0777);
我试过了:
$file_contents = iconv("Windows-1252", "UTF-8", $file_contents);
和
$file_contents_utf8 = utf8_encode($file_contents_utf8);
尝试让PHP脚本以UTF-8编码文件。
使用ZipArchive
库保存时如何让PHP脚本将文件编码为UTF-8?
答案 0 :(得分:0)
不要使用任何转换功能;只需在任何地方使用utf8。
让我们检查一下你是否真的有utf8 - 在PHP中,使用bin2hex()
函数,将其应用于可能包含£
的字符串,你应该看到C2A3
,这是utf8十六进制£
。