DOCX编码问题

时间:2016-08-11 15:49:08

标签: php mysql encoding utf-8 zip

我有一个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?

1 个答案:

答案 0 :(得分:0)

不要使用任何转换功能;只需在任何地方使用utf8。

让我们检查一下你是否真的有utf8 - 在PHP中,使用bin2hex()函数,将其应用于可能包含£的字符串,你应该看到C2A3 ,这是utf8十六进制£