しばらく前のエントリ[Perl で文字列を数字文字参照に変換する方法](/2006/06/18/1)でも

同じ話題を扱いましたが、出した例、解決策がオーバースペックであまりスマートではなかったので、まとめ直すエントリ。

なお、以下に挙げる例は、UnicodeをサポートしたPerl(Perl 5.8以降)を対象にしたものとなります。

数字文字参照へ変換

数字文字参照へ変換する場合、utf8フラグが重要になってきます。 utf8フラグが立っていないと、うまいこと変換されません。 というか日本語などを扱う場合、utf8フラグは結構重要な気がします。

use Encode;
$str = '日本語文字列'; # 日本語の文字列
$charset = 'utf8';    # 文字列の文字コード
$str = decode($charset, $str); # utf8フラグを立てる
$str =~ s/(.)/ '&#' . ord($1) . ';'/eg; # 十進数で変換
print $str , "\n"; # 日本語文字列 となる

こんな感じです。

徒書の北村さんのエントリPerlで文字列をHTML数値文字参照に変換 でもこれと同じ例と、他の方法が取り上げられているので一読をお勧めします。

一般実体参照へ変換

一般実体参照へ変換する場合HTML::Entities と言うモジュールを使います。

ただし日本語を扱う場合注意が必要で、utf8フラグがたって無いと文字化けします。

use HTML::Entities;
use Encode;
my $str = '<日本語&文字列>';
$str = decode('utf8', $str);
$str = encode_entities($str);
print $str , "\n"; # &lt;&#x65E5;&#x672C;&#x8A9E;&amp;&#x6587;&#x5B57;&#x5217;&gt;となる。

こんな感じです。HTML::Entities使うと一般実体参照への変換は簡単にできますが、 日本語文字列が一緒に数字文字参照へと変換されてしまうので、何らかの工夫が必要だと思われます。

あと、ドキュメントをきちんと読めてないので、なにかを見落としている気がしなくも無いです。

最後に

例として出したコードが間違ってるとか、用語の使い方がおかしいとか、 何か問題があれば、コメントなりトラックバックなりで教えてください。 すぐに訂正します。