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

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


追記: 2006-07-02

にまとめ直しました。

追記: 2006-06-22

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

  • 日

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

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

さらに追記:

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


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


追記: 2006-06-22

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

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

結論から言えば 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-23

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

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


追記: 2018-02-22 この記事は 2006 年に僕がブログ始めた当初の記事です。

nyarlaが大体

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