カラクリスタ

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

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

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

追記 (2) (2006-07-02T13:00:00+09:00)

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

追記 (1) (2006-06-22T18:00:00+09:00)

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

日 のような文字参照の形式は、

HTML Entities ではなく HTML数字文字参照 です。

微妙に勘違いしてました。

URI直したいですが、URI変えるのは困ることが起きそうなのでそのままにしておきます。

あとTrackback受け取るシステムが微妙におかしいです。直さなくては。

さらに追記:

なんか表記が直ってないので直しました。

これで大丈夫なはず。

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

追記 (2006-06-22T18:00:00+09:00)

この例はややオーバースペックらしいです。

詳しくは北村さんのエントリ

を参照してもらえると助かります。

そして北村さんの方法のほうがスマートだったりする。

元文

結論から言えば 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/06/18現在 さくらのレンタルサーバのスタンダードプラン を使っているのですが、Unicode::Escape は入ってませんでした。

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

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

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

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

どうでもいいですが

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

追記 (2006-06-23T10:00:00)

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

元文

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