У меня есть PHP-скрипт, который считывает информацию из базы данных MySQL и помещает ее в файл DOCX с использованием шаблона. В шаблоне есть заполнители, называемые <<<variable_name>>>
, где variable_name
- это имя поля MySQL.Проблемы с кодировкой DOCX
Файлы DOCX представляют собой архивы Zip, поэтому мой PHP-скрипт использует библиотеку ZipArchive, чтобы открыть DOCX и отредактировать файл document.xml
, заменив заполнители правильными данными.
Это сработало до сегодняшнего дня, когда я столкнулся с некоторыми проблемами с кодированием. Любые символы, отличные от ANSI, неправильно кодируются и приводят к повреждению выходного DOCX. MS Word дает сообщение об ошибке «Недопустимый символ XML».
Когда я разархивирую документ и открываю document.xml
в блокноте ++, я вижу проблематичные символы. Перейдя в меню кодировки и выбрав «Кодировать в ANSI», я вижу символы обычно: они являются символами Pound (£). Если для N ++ установлено значение «Кодировать в UTF-8», они отображаются в виде шестнадцатеричного значения.
Выбрав параметр N ++ для «Преобразовать в UTF-8», символы отображаются ОК в UTF-8, а 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.
Как я могу заставить PHP-скрипт кодировать файл в UTF-8 при сохранении, используя библиотеку ZipArchive
?