Perl,Starman:syswrite中的Unicode宽字符

3

我有这个单词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 行 syswrite 中出现宽字符。

为什么呢?

这是部分代码:

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>
3个回答

2

问题1:

如果您的源代码是使用UTF-8编码的,但没有使用use utf8;告诉Perl。

如果您的源代码不是使用UTF-8编码的,则不可能在其中包含“Я”字符。


问题2:

文件句柄只能传输字节,但您没有将Unicode字符编码为字节。这可以通过使用字符编码(如UTF-8)来完成。您的文档指定使用哪种编码?按照以下方式对输出进行编码:

binmode STDOUT, ':encoding(UTF-8)';

尝试添加<%init>binmode STDOUT, ':encoding(UTF-8)';</%init>和<head><meta http-equiv="Content-Type" content="text-html; charset=utf-8" /><head>,但仍然出现相同的错误。我错过了什么? - mamesaye
不确定这是什么,但你发的不是 Perl。你只是在评论中重复了之前发布的内容。 - ikegami
我正在使用Mason 2(Perl + HTML)。我从数据库中接收一个字符串(标题)并将其打印出来。 - mamesaye

1
一些代码:

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>  

这个链接很有帮助。


1

通过用HTML实体替换转义字符几乎从来不是正确的做法。

可能底层服务器(催化剂?)不支持Unicode。在CPAN中搜索Catalyst :: Plugin :: Unicode :: Encoding可能会有所帮助。


我正在使用Mason 2,并且这个代码是有效的($str =~ s/&/%26/g;)。 - mamesaye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接