カラクリスタ

「輝かしい青春」なんて失かった人のブログ

Perl で文字列を数字文字参照に変換する方法

Perlで文字列をHTML Entities数字文字参照に変換する方法がわからなくて、 いろいろやったり、はてなで質問してみたりした結果、 やり方が分かったのでメモ。

追記:2006-07-02

Perlで文字列を一般実体参照や数字文字参照に変換する方法まとめ - カラクリスタ

にまとめ直しました。

追記:2006-06-22

Perl で文字列を HTML 数値文字参照に変換

で北村さんに突っ込まれて気づいたので間違いの訂正。

日

のような文字参照の形式は、HTML EntitiesではなくHTML数字文字参照です。微妙に勘違いしてました。

URIを直したいですが、URIを変えるのは困ることが起きそうなのでそのままにしておきます。 あとTrackback受け取るシステムが微妙におかしいです。直さなくては。

さらに追記:

なんか表記が直ってないので直しました。これで大丈夫なはず。


Perl で文字列を HTML Entities 数字文字参照 に変換する方法

追記:2006-06-22

この例はややオーバースペックらしいです。詳しくは北村さんのエントリ、

Perlで文字列をHTML数値文字参照に変換

を参照してもらえると助かります。そして北村さんの方法のほうがスマートだったりする。


結論から言えば Unicode::Escapeを使えばできます。 どうやるかのかというと、

use Unicode::Escape;
my $str     = '日本語文字列';
my $charset = 'utf8';         # 文字コード
$str = Unicode::Escape::escape($str,$charset);
$str =~ s/\\u( [[0-9a-f]] +)/&#x$1;/ig;
# 16進数# 10進数の場合こっち
# $str =~ s/\\u( [[0-9a-f]] +)/'&#' . hex($1) . ';'/egi;

こんな感じ。結構簡単だった。

しかし、問題が無いわけではないッ!

何故断言しているのでしょうか(´∀`)?っていうか何で断言できるのでしょうか。

答えは簡単です。Unicode::Escape は、

サーバによっては入っていません

しかも、

インストールがめんどくさい

からです。……言い切っちゃってるよ。いいのかよ。っていうか何なんだこのノリ。

まあそれは置いといて。Nyarla.net のサーバは2006年6月18日現在、 さくらのレンタルサーバのスタンダードプラン を使っているのですが、Unicode::Escape は入ってませんでした。

で、PurePerl モジュールだったら FTP でアップロードするだけで使えるようになるんですが、 Unicode::Escape を動かすために必要なモジュール Unicode::StringXS を利用している ためコンパイルしないとだめなので、 telnet でログインして

%perl -MCPAN -e shell
cpan> install Unicode::Escape

してやる必要があります。これがめんどい理由。ちなみにレンタルサーバがシェルログインを許可して無いとできません。

もっとも一度やってしまうとあとは楽なので、問題ないかもしれませんが。っていうか利用するのにちょっと敷居が高い気がしなくも無いです。 GoogleCPAN レンタルサーバ あたりで検索すると色々出てくるので詳しいことはそのあたりで調べてください。

どうでもいいですが

上のほうで微妙に AA 使ってる理由は Unicode::Escape のテストするためだったりします。うまくいってるといいけど。

しかし、またしても長いし見づらいような……。CSS がまずいのかな?


追記:2006-06-23

現在、 Unicode::Escape は数字文字参照のために 使ってません