2012-10-11 42 views
2

我有這個詞comЯade,但我不能打印在HTML因爲俄羅斯Я...我 嘗試:的Perl,接龍的Unicode寬字符在SYSWRITE在

$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;  

但在這兩種情況下,我得到這個錯誤:在

寬字符SYSWRITE在/ usr /本地/ share/perl/5.10.1/Starman/Server.pm line 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> 

回答

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> 

this link是有益的。

2

問題1:

如果源代碼使用UTF編碼-8,你沒有'通過使用use utf8;來告訴Perl。

如果您的源代碼不是使用UTF-8編碼的,它不可能在其中包含「Я」。


問題2:

文件句柄只能傳輸字節,但你沒有你的Unicode字符編碼成字節。這是通過使用諸如UTF-8的字符編碼完成的。你的文件指定它使用什麼編碼?使用它編碼輸出如下:

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

嘗試添加<%init> binmode STDOUT,':encoding(UTF-8)';但仍然有相同的錯誤。我錯過了什麼? – mamesaye

+0

這就是我們想要的:破碎的代碼的任何樣本。 – ikegami

+0

增加了一些代碼。感謝您的幫助 – mamesaye

1

通過將它們替換爲html實體來轉義字符幾乎從來都不是正確的做法。

底層服務器(催化劑?)可能無法識別unicode。在CPAN中搜索Catalyst :: Plugin :: Unicode :: Encoding可能有所幫助。

+0

我正在使用梅森2.這是工作($ str =〜s /&/%26/g;)。 – mamesaye