Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > utf-8, HTML::Template и warning |
Автор: AlexPet 12.8.2008, 12:41 | ||
Добрый день! Пытаюсь разобраться с utf-8 применительно к шаблонизатору HTML::Template Итак, имеем: файл шаблона содержит символы в кодировке utf-8 1) Если вызывать $htmltmpl->output() без передачи в шаблон параметров (либо с передачей параметров, не содержащих утф8-символы), то отображается все как надо 2) Если же передавать параметры, содержащие символы в кодировке utf-8, то на выходе получаем: а) кразобляки в тех местах, где в шаблоне юникод б) нормальные символы там, где были переданы параметры юникодные Пробовал всяческие комбинации с use open :utf8; binmode STDOUT, ":utf8"; utf8::*. Не получилось. Нашел в интернете решение ( http://www.mail-archive.com/[email protected]/msg02273.html ), которое сводится к следующему:
(можно конечно открывать файл самому темплейта, и при открытии указывать '<:utf8', а затем передавать его через filehandle => $fh, но это совсем некрасиво) Вопрос: можно ли как-то изящнее решить данную проблему? P.S. Сам я только начал работать с UTF-8, могу упустить какое очевидное решение ![]() P.P.S. А warning в названии - это при использовании Encode::decode_utf8 вместо utf8::decode получался ![]() |
Автор: Bulat 15.8.2008, 09:29 | ||
AlexPet, ммм даж не знаю поможет или нет, но просто
не пробовали ?? ![]() |
Автор: AlexPet 18.8.2008, 08:38 |
Конечно пробовал ![]() без толку. Пока нашел два решения (либо подключать темплейт как файловый дескриптор с указанием utf8 на open, либо через фильтр к темплейту.. об этом я, впрочем, написал выше) |
Автор: ginnie 18.8.2008, 12:54 | ||||
Уважаемый AlexPet, есть еще пара вариантов: 1. Попробовать
2. Создать дочерний класс HTML::Template::Unicode, в котором переопределить функцию open():
|
Автор: AlexPet 19.8.2008, 08:02 | ||
Bulat, в теории да, но HTML::Template использует хитрый алгоритм (который описан по ссылке выше):
ginnie, по этой же причине не будет работать и первый предложенный Вами метод (поскольку модуль сам осуществляет перекодировки, и не всегда правильно). За второй метод спасибо, возьму на заметку, если нужно будет использовать в серьезном проекте. Пока что быстро слабал на коленке через фильтр ![]() Очень странно, что до сих пор не закоммитили предложенное изменение в этот модуль. Все-таки проблема известная, и патч был предложен для ее решения (опять же по ссылке в моем первом посте)... Всем спасибо за обсуждение, тему помечаю как решенную (будем ждать новых релизов хтмл::темплейт ;) ) |
Автор: Ramirez 20.8.2008, 10:04 |
Я так понимаю, если шаблон берется не из файла (из базы например) то этой проблемы не возникает? |
Автор: AlexPet 20.8.2008, 12:22 |
Не совсем понял, что значит из базы (шаблон можно брать либо из файла, либо из файлового манипулятора), но решение в случае с файловым манипулятором я привел выше (через указание кодировки на поток) |
Автор: Ramirez 22.8.2008, 11:37 | ||
Ну вот собственно как-то так:
где переменная $ref_to_template_text или $ref_to_array_of_lines содержит текст шаблона. А браться он может откуда угодно. Хоть динамически генерироваться. |
Автор: Vavilen 4.3.2012, 16:49 | ||||
Мне очень помогло Ваше решение! Спасибо! |