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

読了まで:約2分


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


追記: [[2006-07-02]]

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

にまとめ直しました。

追記: [[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 年に僕がブログ始めた当初の記事です。

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。