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::String が XS を利用している ためコンパイルしないとだめなので、telnet でログインして
%perl -MCPAN -e shell
cpan> install Unicode::Escape
してやる必要があります。これがめんどい理由。ちなみにレンタルサーバがシェルログインを許可して無いとできません。
もっとも一度やってしまうとあとは楽なので、問題ないかもしれませんが。っていうか利用するのにちょっと敷居が高い気がしなくも無いです。 Google で CPAN レンタルサーバ
あたりで検索すると色々出てくるので詳しいことはそのあたりで調べてください。
どうでもいいですが
上のほうで微妙に AA 使ってる理由は Unicode::Escape
のテストするためだったりします。うまくいってるといいけど。
追記: [[2006-06-23]]
現在、 Unicode::Escape
は数字文字参照のために 使ってません 。
しかし、またしても長いし見づらいような……。CSS がまずいのかな?