вторник, 6 марта 2012 г.

Кирилица в PHPWord

Используя нашу любимую и просто чудесную библиотеку PHPWord многие сталкиваются с проблемой кодировки. Оказывается разработчики дважды "кодят" в utf-8. Зачем? я не решусь копаться во всех "премудростях". Ну а чтобы увидеть наши русские буковки сделайте так:

Найдите файл PHPWord/Section.php и закомментите все строчки, в которых встречается utf8_encode(). Строку с переменной !!!$givenText;!!! Её комментить не нужно!!! Можно прописать только $givenText = $text;

Источник сией мудрой мысли тут.
Я сам все проверил, работает на ура. !!!главное не забудьте сам файл кодировать),благо блокнот плас плас не проприетарный)))

З.Ы. Как верно подметил мистер Сoolakov, та же трабла возникает и при заполнении таблиц, читайте его коммент ниже и будет вам "решпект" от клиента или препода.

14 комментариев:

  1. Та же самая проблема встречается и при создании таблиц.
    Но и решение, собственно то же самое: в файле PHPWord\Section\Table\Cell.php закомментировать строки с utf8_encode()

    ОтветитьУдалить
  2. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  3. Только установил сие диво. Вопрос: можно ли сохранять именно в doc а не в docx. При вызове используется writer2007 а вот 2003й имеется ли? теоретически надо просто не упаковывать doc используя зиповскую библу?? Может ответ уже имеется у вас и мне не надо самому тратить время и серое вещество?

    ОтветитьУдалить
  4. подружить с кириллицей выше описанным методом не удалось. Если закоментировать все utf8_encode - ворд сгенерированный фал открыть не может. Проверял mb_detect_encoding() в функции передается utf8.

    ОтветитьУдалить
  5. Пытаюсь найти как объединить ячейки. Помогите, если знаете.

    ОтветитьУдалить
  6. Нужно не комментировать, а заменить на iconv('windows-1251', 'UTF-8',$text); Так точно работает.

    ОтветитьУдалить
  7. У меня ни iconv('windows-1251', 'UTF-8',$text); ни mb_convert_encoding не сработало. Помогло именно закомментирование.
    Сервер - последний apache, ОС - Win2003 русская.

    ОтветитьУдалить
  8. Если работаете с Template.php, то обязательно нужно закоментировать ~/PHPWord/Template.php. 89 строка после изменения //$replace = utf8_encode($replace);

    ОтветитьУдалить
  9. $givenText = utf8_encode($text);
    на
    $givenText = mb_convert_encoding ($text,'UTF-8','Windows-1251');

    $linkSrc = utf8_encode($linkSrc);
    на
    $linkSrc = mb_convert_encoding ($linkSrc,'UTF-8','Windows-1251');

    $linkName = utf8_encode($linkName);
    на
    $linkName = mb_convert_encoding ($linkName,'UTF-8','Windows-1251');

    $text = utf8_encode($text);
    на
    $text = mb_convert_encoding ($text,'UTF-8','Windows-1251');

    $replace = utf8_encode($replace);
    на
    $replace = mb_convert_encoding ($replace,'UTF-8','Windows-1251');

    И при сохранении исходных файлов PHPWord смотрим чтобы кодировка была 1251.
    И в файле откуда вызываем скрипт тоже 1251.

    либо работаем везде с UTF-8 и тогда можно совсем убирать преобразование utf8_encode().

    ОтветитьУдалить
  10. Вот спасябо авторам и Владельцу этого сайта, а так же всем ребятам в комментариях к посту!!! Помогло, хотел было уже отказываться в сторону ручной генерации Word

    ОтветитьУдалить