LINUX.ORG.RU

TT, PERL utf8


0

0

Apache2, template-toolkit, Postgresql, локаль utf8.
Все шаблоны в utf8.

В коде *.pl никаких команд для utf8 не вставлял.
Все устраивает только не работают (вместо букв значки):
- плагин String;
- функция substr;
- в выводе функций perl.

Испробовал разные варианты, читал:
http://www.nestor.minsk.by/sr/2008/09/sr80902.html


У substr какие-то проблоемы с этим, такое чувство что она может работать только с байтами. Я чтобы решить эту пробелму перекодировал строку в cp1251 с помощью Encode. Криво. ЛУчше конечно выдернуть регуляркой (они понимают локаль).

OxiD ★★★★
()
Ответ на: комментарий от OxiD

Все функции работы с текстом и регулярные выражения выдают ромбики.
Если начать мудрить с use utf8, то страдает вывод страниц.

WinLin
() автор топика
Ответ на: комментарий от WinLin

oxid@ ~> perl -e ' use utf8; $str=«Привет»; $str=~/^(.)/; print $1,«\n»'
Wide character in print at -e line 1.
П


oxid@ ~> perl -e ' use utf8; $str=«privet»; $str=~/^(.)/; print $1,«\n»'
p


Использовать (..) - неправильно. регулярки должны работатьс символами

OxiD ★★★★
()
Ответ на: комментарий от WinLin

Слушай, у меня етсь довольно большйо проект на DBIx::Class и TT2, все данные в utf8, никаких проблемЮ кроме вышеописаной с substr я не втсречал. Видимо у тебя что-то особенное, например переменные локали не установлены.

Можешь привести наиболее простой код который у тебя работает неправильно типа

my $a={title=>«Привет»}; print_template($a);

__TEMPLATE__
<html>[%title%]</html>

и что у тебя будет выводится (я написал что-то неправильное - свой пример пиши сам)

OxiD ★★★★
()
Ответ на: комментарий от OxiD

Добавление «use utf8;» коверкает весь файл *.t.
Упрошенный пример файла, который просто выводит шаблон,
после чего общение идет через AJAX/JSON.


#!/usr/bin/perl

use lib '/var/www/xxx/perl','/var/www';

use strict;
use Template;
use Apache2::Request;

my $r = shift;
my $req = Apache2::Request->new($r);

$r->content_type('text/html; charset=utf-8');

my $file = $req->param('file');

my $tt = Template->new(
{
INCLUDE_PATH => [ '/var/www/xxx/t', '/var/www/lib' ],
INTERPOLATE => 1,
PRE_CHOMP => 1,
POST_CHOMP => 1
}
) || die «$Template::ERROR\n»;

$tt->process( $file . '.t', {} ) || die $tt->error(), «\n»;
1;

WinLin
() автор топика
Ответ на: комментарий от WinLin

Вот код который работает у меня. У меня правда не мод_перл, а fastcgi и nginx, возможно в этом дело. никаких use utf8 нет (я их ставлю только в нужных блоках).


sub print_template
 {
     my ($filename, $data, $cgi) = @_;
     my $tmpl = $config->section('template_dir');
     die "Templates dir not configured!\n"
       unless (defined $tmpl
               && $tmpl ne "");
     $tmpl .= "/$filename.tmpl";
     print_header($cgi);
     require Template;
     my $template = Template->new(
                                ABSOLUTE     => 1,
                                DEBUG        => 1,
                                INCLUDE_PATH => $config->section('template_dir'),
                                COMPILE_DIR  => $config->{compile_path}
     );
     $template->process($tmpl, $data)
       || do
     {
         my $error = $template->error();
         print "<pre>error type: ", $error->type(), "\n", "error info: ",
           $error->info(), "\n", $error, "\n</pre>";
       }
 }

sub print_header
 {
     my $cgi = $_[0];
     print $cgi ->header(
                       '-charset'       => "utf-8",
                       '-type'          => "text/html",
                       '-last-modified' => gmtime() . " GMT",
                       '-Cache-Control' => "no-store, no-cache, must-revalidate",
                       '-Pragma'        => "No-Cache",
                       '-Expires'       => "-1",
     );
 }


OxiD ★★★★
()
Ответ на: комментарий от OxiD

Покажи переменные окружения, из скрипта (важно узать что выставляет mod_perl). И возможно что параметры типа AddDefaultCharset UTF-8 апача так же влияют.


Попробуй выплюнуть без TT какой нибудт хтмл в утф8 и посомтри что будет.

OxiD ★★★★
()
Ответ на: комментарий от Viglim

А теперь пару-тройку постов выше мой ответ глянь ;)

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.