しばらく前のエントリ 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 使うと一般実体参照への変換は簡単にできますが、日本語文字列が一緒に数字文字参照へと変換されてしまうので、何らかの工夫が必要だと思われます。
あと、ドキュメントをきちんと読めてないので、なにかを見落としている気がしなくも無いです。
最後に
例として出したコードが間違ってるとか、用語の使い方がおかしいとか、何か問題があれば、コメントなりトラックバックなりで教えてください。すぐに訂正します。