カラクリスタ

『輝かしい青春』なんて失かったヒトのブログ

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

しばらく前のエントリ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 使うと一般実体参照への変換は簡単にできますが、 日本語文字列が一緒に数字文字参照へと変換されてしまうので、何らかの工夫が必要だと思われます。

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

最後に

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