« はい!千番そうめん | メイン | 本日の体操 »

2005年08月18日

[技術] Perl,utf8,XML::LibXML,Template-Toolkit

【覚え書き】

Perl5.8.5で、XML::LibXMLを使用して、属性値にセットされたutf8(UNICODE)の文字列をgetAttribute()で取得して、Template-Toolkitに渡すとWide Characterなんちゃらというエラーでアボートしてしまう。属性ではなくて、通常のノードのutf8文字列をセットした場合は問題無く動作する。

どうも、getAttribute()で取得したutf8文字列はutf8フラグがたっていずにバイト列としてリターンされるのがアボートする原因らしい。

そこで、use utf8;を追加して、utf8::encode()で強制的にutf8フラグをセットしたら、取り敢えずアボートしないで動作し、日本語が正しくブラウザに標示された。

----------------------
use utf8;

.....
if ($node->nodeName eq 'image' &&
$node->parentNode()->nodeName eq 'point'
) {
my $string = get_cdata($node);
$parent->{image} = $string;
$parent->{image_url} = get_public_url($c, 'images/'.$string);
$string = $node->getAttribute('title');
utf8::encode($string); ## getAttribute()の場合、必要
$parent->{imgtitle} = $string;
}
....
}

sub get_cdata
{
my $node = shift;
my $string;
foreach my $child ($node->getChildnodes) {
$string .= $child->toString();
}
return $string;
}

投稿者 nekobara : 2005年08月18日 22:13


トラックバック

このエントリーのトラックバックURL:
http://www.ishihara.ne.jp/mt/mt-tb.cgi/503

コメント