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"; # 日本語文字列 となる

こんな感じです。

一般実体参照へ変換

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

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

最後に

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

nyarlaが大体

Scrapbox でコメントや意見を書く