2016-08-11 2 views
1

У меня есть 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?

ответ

0

Не используйте функции преобразования; просто используйте utf8 всюду.

Давайте посмотрим, что у вас действительно есть utf8 - В PHP, используйте функцию bin2hex(), применить его к строке, которая предположительно содержит £, вы должны увидеть C2A3, который является utf8 шестигранной £.

Смежные вопросы