Скрипт вывода из php в rtf-шаблон

wfire

Новичок
Здравствуйте!
Очень понравилось вот это решение: ссылка
Но при попытке реализации столкнулся с проблемой кодировки.
Итак, создал тестовый файл rtf.php (сам файл в кодировке utf8):
---------------------------------------
PHP:
$rtf = new RTF_Template('present.rtf');
$insects = "ТараканиЩе";
//$message1251 = charset_x_win($insects); //конвертация UTF-8 -> win1251
$rtf->parse('insects',  $insects); // вставит вместо тега <strong>{DATE}</strong> в шаблоне текущий год
$rtf->out_h('incect.rtf');
//$rtf->out_f('имя файла для создания в каталоге');
echo $rtf->out(); //вывод в текущий viewport
-------------------------------------------
Затем при помощи WordPad создал файл-шаблон present.rtf следующего содержания:
-------------------------------------------
Впервые на арене цЫрка: {insects}!!!
-------------------------------------------
В результате получаю следующее:
-------------------------------------------
Впервые на арене цЫрка: ТараканиЩе!!!
-------------------------------------------
Пробовал перекодировать переменную в win1251, но тоже получил кракозябры, только немного другие :)
Пробовал сам файл rtf.php сохранять в win1251 - тот же результат.

К сожалению, оставить комментарий с обращением к автору в указанном блоге не удается.
Подскажите, пожалуйста, как можно решить проблему с русским языком.

P.S. И еще п.2 в этом посте относительно приведения документа к одному языку я не понял. Где в WordPad можно выставить язык (или кодировку)?
 

С.

Продвинутый новичок
rtf.php -- известно в какой кодировке,
переменная -- известно в какой кодировке,
шаблон -- хрен знает в какой кодировке,
и ты еще задаешь вопрос, как решить проблему?

А вообще совершенно не важно, в какой кодировке все перечисленное выше. Важно в какой кодировке веб-страница. Так в какой она?
 

wfire

Новичок
А какую веб-страницу вы имеете в виду? Вообще весь сайт в utf8.
Насчет шаблона - а как определить, в какой кодировке файл rtf, и, самое главное - как задать ему нужную кодировку?
P.S. Судя по нижеприведенному фрагменту, файл rtf в кодировке 1251:
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fcharset204{\*\fname Arial;}Arial CYR;}{\f1\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20\'c2\'ef\'e5\'f0\'e2\'fb\'e5 \'ed\'e0 \'e0\'f0\'e5\'ed\'e5 \'f6\'db\'f0\'ea\'e0: \lang1033\f1\{insects\}!!!\lang1049\f0\par
}
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Очень понравилось вот это решение: ссылка
Напрасно понравилось, это не решение, а хрень.

В ём минимум две проблемы:
1) Кодирование русских букв, как уже заметил. Это решается просто:
PHP:
// подразумевается кодировка 1251
$insects = preg_replace("/([А-Яа-яёЁтТ]{1,1})/ei", "\"\'\".dechex(ord(\"\\1\"))", $insects);
2) Шаблон {foo} в файле может быть разбит на кусочки, особенно если файл кто-то будет править. Это решается сложнее.
 

wfire

Новичок
Напрасно понравилось, это не решение, а хрень.

В ём минимум две проблемы:
1) Кодирование русских букв, как уже заметил. Это решается просто:
PHP:
// подразумевается кодировка 1251
$insects = preg_replace("/([А-Яа-яёЁтТ]{1,1})/ei", "\"\'\".dechex(ord(\"\\1\"))", $insects);
2) Шаблон {foo} в файле может быть разбит на кусочки, особенно если файл кто-то будет править. Это решается сложнее.
1. Спасибо, попробую этот вариант.
2. Файлы шаблонов править никто не будет.
А вообще, какие еще есть варианты формирования файлов .doc или .rtf средствами Php?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
1. Спасибо, попробую этот вариант.
2. Файлы шаблонов править никто не будет.
А вообще, какие еще есть варианты формирования файлов .doc или .rtf средствами Php?
Тут надо разделять "формирование файлов" и "подстановку в шаблоны". Для формирования с нуля есть phpWord или PHPRtfLite, например. Для подстановки в RTF можно своё написать, благо у мелкомягких формат задокументирован и пример парсера на C есть. Для ворда (.docx) тоже можно сделать, наверное.
 

wfire

Новичок
$insects = preg_replace("/([А-Яа-яёЁтТ]{1,1})/ei", "\"\'\".dechex(ord(\"\\1\"))", $insects);
Это не помогло, все равно в rtf- файле кракозабры выходят...
Я так понял, это конвертация UTF8->Win1251? Или наоборот?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Это не помогло, все равно в rtf- файле кракозабры выходят...
Я так понял, это конвертация UTF8->Win1251? Или наоборот?
Неправильно понял: это кодирование не-ASCII символов для использования в RTF. Посмотри на свой собственный RTF, в каком виде там русский текст про арену цырка.
Перед тем, как пускать это кодирование, надо текст перевести в кодировку cp1251. И скрипт свой желательно в этой же кодировке держать, для удобства.
 

wfire

Новичок
Неправильно понял: это кодирование не-ASCII символов для использования в RTF. Посмотри на свой собственный RTF, в каком виде там русский текст про арену цырка.
Перед тем, как пускать это кодирование, надо текст перевести в кодировку cp1251. И скрипт свой желательно в этой же кодировке держать, для удобства.
Попробовал - файл rtf.php пересохранил в win1251, применил кодирование - один фиг кракозябры...
содержимое файла-шаблона я приводил выше, вот еще раз:
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fcharset204{\*\fname Arial;}Arial CYR;}{\f1\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20\'c2\'ef\'e5\'f0\'e2\'fb\'e5 \'ed\'e0 \'e0\'f0\'e5\'ed\'e5 \'f6\'db\'f0\'ea\'e0: \lang1033\f1\{insects\}!!!\lang1049\f0\par
}
Ansi1251 кодировка у него выходит?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Попробовал - файл rtf.php пересохранил в win1251, применил кодирование - один фиг кракозябры...
содержимое файла-шаблона я приводил выше, вот еще раз:
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fcharset204{\*\fname Arial;}Arial CYR;}{\f1\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20\'c2\'ef\'e5\'f0\'e2\'fb\'e5 \'ed\'e0 \'e0\'f0\'e5\'ed\'e5 \'f6\'db\'f0\'ea\'e0: \lang1033\f1\{insects\}!!!\lang1049\f0\par
}
Ansi1251 кодировка у него выходит?
Да, попробовал у себя запустить, действительно кракозябры. Проблемы по ходу с шаблоном, а конкретно вот тут:
Код:
\lang1033\f1\{insects\}!!!
он почему-то на английский переключается, похоже. В вордпаде язык выставить нельзя, при установке языка в ворде работать это перестаёт ровно по той причине, о которой я писал выше:
2) Шаблон {foo} в файле может быть разбит на кусочки, особенно если файл кто-то будет править. Это решается сложнее.
ибо ворд у меня вставляет что-то между открывающей скобкой и словом insects.
 

akxxiv

Новичок
Хм, а таблички или просто повторяющиеся блоки пробовал реализовать?
 

wfire

Новичок
Хм, а таблички или просто повторяющиеся блоки пробовал реализовать?
Нет, не пробовал, есть принципиальная разница по сравнению с обычным текстом?
 

akxxiv

Новичок
Ну например надо заполнить таблицу (произвольное количество рядов), а в шаблонизатор передаешь не стоку, а массив с данными...
 

wfire

Новичок
Попробовал вывод из базы... Получается много-много крякозябров...
 
Сверху