Perlで文字列を一般実体参照や数字文字参照に変換する方法まとめ

読了まで:約1分


しばらく​前の​エントリ [[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"; # 日本語文字列 となる

こんな​感じです。

一般実体参照へ​変換

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

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

use HTML::Entities;
use Encode;
my $str = '<日本語&amp;文字列>';
$str = decode('utf8', $str);
$str = encode_entities($str);
print $str , "\n"; # <&#x65e5;&#x672c;&#x8a9e;&amp;&#x6587;&#x5b57;&#x5217;>となる。

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

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

最後に

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

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。