カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

HTML::Entitesで非ASCII文字を数字文字参照にしない方法

概要: HTML::Entites hack


PerlでHTMLの一般文字参照とか数字文字参照とかを扱うのにHTML::Entitiesというモジュールがあるんだけど、 これは日本語とかのASCII以外をすべて数字文字参照にしてしまうので、その辺りの対処方。

一番手っ取り早いのは、

use strict;
use warnings;
use utf8;
use HTML::Entities;
{
    no warnings 'redefine';
    *HTML::Entities::num_entity = sub { $_[0] };
}
print encode_entities('<あああ>');

こんな感じにすることなんだけど、これするとencode_entities_numericが動かなくなる。 あとどう見てもバッドノウハウ。

なんで、%HTML::Entities::entity2char%HTML::Entities::char2entityあたりを使って、 自前でエンコードする関数を書く、というのが多分スマート。

というのを思いついた。なんでとりあえずメモ。

追記

さっき気づいたけど、別にこんなことしなくても、 encode_entitiesの第二引数でなんとかなる。 ざっとこんな感じ。

use strict;
use warnings;
use utf8;
use HTML::Entities;
print encode_entities('<あああ>', '<>&');

ちゃんとPODに載ってるし。