Perl, широкий символ Starman Unicode в системной записи на

У меня есть это слово comЯade, но я не могу напечатать его в HTML из-за русского Я... Я пробовал:

$HTML::Entities::char2entity{'Я'} = 'Я';  
$HTML::Entities::char2entity{'1071'} = 'Я';  
$HTML::Entities::char2entity{'ï'} = 'Я';  
$str = HTML::Entities::encode_entities( $str, q{Яï1071} );   

и после этого я попробовал:

$str =~ s/1071/Я/g;
$str =~ s/Я/Я/g;
$str =~ s/ï/Я/g;    

Но в обоих случаях я получаю эту ошибку:

Широкий символ в системной записи в /usr/local/share/perl/5.10.1/Starman/Server.pm, строка 470.

Почему?

Некоторый код:

title.mi

<%init>
binmode STDOUT, ':encoding(UTF-8)';
($str =~ s/&/%26/g;); #this is working
$str =~ s/1071/&#1071;/g;
$str =~ s/Я/&#1071;/g;
$str =~ s/ï/&#1071;/g;
</%init>
<div class="bd-headline left">
<h1 style="margin-top:0; padding-top:0;"> <% $str %> </h1>
</div>

base.mc

<head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

person mamesaye    schedule 11.10.2012    source источник


Ответы (3)


Проблема 1:

Если ваш исходный код закодирован с использованием UTF-8, вы не сообщили Perl столько же, используя use utf8;.

Если ваш исходный код не закодирован с использованием UTF-8, в нем не может быть «Я».


Проблема 2:

Дескрипторы файлов могут передавать только байты, но вы не кодируете символы Unicode в байты. Это делается с помощью кодировки символов, такой как UTF-8. Какая кодировка используется в вашем документе? Закодируйте свой вывод, используя его следующим образом:

binmode STDOUT, ':encoding(UTF-8)';
person ikegami    schedule 11.10.2012
comment
попытался добавить ‹%init›binmode STDOUT, ':encoding(UTF-8)';‹/%init› и ‹head›‹мета http-equiv=Content-Type content=text-html; charset=utf-8 /›‹head›, но все еще имеет ту же ошибку. что мне не хватает? - person mamesaye; 11.10.2012
comment
Не уверен, что это такое, но это не Perl, который вы опубликовали. Вы просто повторили то, что написали ранее в комментарии. - person ikegami; 11.10.2012
comment
Я использую mason 2 (perl + html). Я получаю строку (заголовок) из БД и печатаю ее. - person mamesaye; 11.10.2012

Экранирование символов путем замены их html-сущностями почти никогда не бывает правильным.

Возможно, базовый сервер (катализатор?) не поддерживает юникод. Поиск по CPAN вызывает Catalyst::Plugin::Unicode::Encoding, что может помочь.

person evil otto    schedule 11.10.2012
comment
я использую mason 2. и это работает ($str =~ s/&/%26/g;). - person mamesaye; 11.10.2012

Некоторый код:

title.mi

<%init>  
        use Encode;
        my $hl = encode_utf8($str);  
        my $find = "&#1071;";   
        my $replace = "Я";  
        $hl =~ s/$find/$replace/g; 
        my $hs = HTML::Strip->new();
        my $no_html_hl = $hs->parse($hl); 
</%init>
<div class="bd-headline left">
            <h1 style="margin-top:0; padding-top:0;"> <% $no_html_hl %> </h1>
</div>

base.mc

<head>    </head>  

эта ссылка оказалась полезной.

person mamesaye    schedule 18.10.2012