しばらく前のエントリ [[Perl で文字列を数字文字参照に変換する方法]] でも同じ話題を扱いましたが、出した例、解決策がオーバースペックであまりスマートではなかったので、まとめ直すエントリ。
なお、以下に挙げる例は、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"; # <日本語&文字列>となる。
こんな感じです。HTML::Entities
使うと一般実体参照への変換は簡単にできますが、日本語文字列が一緒に数字文字参照へと変換されてしまうので、何らかの工夫が必要だと思われます。
あと、ドキュメントをきちんと読めてないので、なにかを見落としている気がしなくも無いです。
最後に
例として出したコードが間違ってるとか、用語の使い方がおかしいとか、何か問題があれば、コメントなりトラックバックなりで教えてください。すぐに訂正します。