C::P::Session::State::URI で HTML::Entities に日本語をエスケープさせない方法
Catalyst - Session管理とHTMLエンティティコード(数値文字実体参照) でも言及されているように、Catalyst::Plugin::Session::State::URI を使っていると、
<img alt="日本語" />
などが、エスケープされてしまい、表示がおかしくなったりします。
Catalyst - Session管理とHTMLエンティティコード(数値文字実体参照) でも言及されているように、Catalyst::Plugin::Session::State::URI を使っていると、
<img alt="日本語" />
などが、エスケープされてしまい、表示がおかしくなったりします。
ふと、for で回してパラメーターの個数分変換するのと、Data::Dumper でダンプして1回だけ変換して eval するのとどっちが速いのか気になってベンチマーク取ってみました。
コードと結果は以下。
Catalyst::Plugin::FillInForm::ForceUTF8 に抜けがあったのでパッチ書きました。
--- lib/Catalyst/Plugin/FillInForm/ForceUTF8.pm.orig 2009-02-08 14:39:24.000000000 +0900
+++ lib/Catalyst/Plugin/FillInForm/ForceUTF8.pm 2009-02-08 14:40:02.000000000 +0900
@@ -115,11 +115,13 @@
sub fillform {
my $c = shift;
my $fdat = shift || $c->request->parameters;
+ my $additional_params = shift;
$c->response->output(
HTML::FillInForm::ForceUTF8->new->fill(
scalarref => \$c->response->{body},
- fdat => $fdat
+ fdat => $fdat,
+ %$additional_params,
)
);
}
携帯サイトの CSS 対応は、今まで HTML::DoCoMoCSS を使用していましたが、01/15 に HTML::MobileJpCSS がリリースされていたので試してみました。
どういうことをしてくれるモジュールかと言うと、例えば hr タグは色を付けたいときに、キャリアによって下記のようにスタイルの指定が違います。
DoCoMo <hr style="border-color:#FF0000;" />
au <hr style="color:#FF0000;" />
SoftBank <hr style="border-color:#FF0000;" />
これを、ひとつの指定でモジュール側で 3 キャリア分の指定方法の振り分けを自動でやってくれるというものです。
Fedra Core 5 に libming をインストールする方法です。
現時点での最新版、ming 0.4.0-rc2 をダウンロードします。
(続きを読む…)
perl でのコーディング中に perldoc で、perlfunc や perlreref を参照することは多々あると思います。
そのドキュメントが日本語ならば、もうちょっと読みやすいと思います。幸い、perldocjp という日本語化プロジェクトで、いくつかの pod ファイルが日本語化されて公開されているので、それをダウンロードして入れ替えてみましょう。
日時を文字列で取得する場合、
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$date = sprintf("%04d/%02d/%02d", $year+1900, $mon+1, $mday);
こんな書き方が多いですが、もっと短くこう書けます。
use POSIX;
my $date = strftime("%Y/%m/%d", localtime);
DateTime モジュールで同じことができますが、POSIX は標準モジュールなのでインストールしなくても使えるというのが強みです。Windows の Strawberry Perl でも使えました。
と、これだけなら大した事無い違いなのですが、strftime はもっと便利です。
(続きを読む…)
RFC 2396 で、unreserved として定められた文字列を URI エスケープする場合には、
$str =~ s/([^a-zA-Z0-9_.!~*'()-])/’%’ . unpack(’H2′, $1)/eg;
とすれば良いですが、エスケープする文字列が UTF-8 の場合、注意しないといけないことがあります。それは、変換前に UTF-8 フラグを落とすことです。
utf8::encode($str) if utf8::is_utf8($str);
を変換前に追加しましょう。
数値リテラルで、頭に 0x や 0 を付ければ、それぞれ 16 進数、8 進数の数値を記述できることは常識でした。
$i = 0×10; #16
$i = 010; #8
しかし、これは知りませんでした。
$i = 0b0101; #5
$s = “\x{3042}”; #あ (UTF-8)
頭に 0b で 2 進数、\x{nnnn} で Unicode 文字を記述できる。
しかし Perl 5.6 以上らしいので、この記述を使う場合は、後ではまらないように
require 5.006;
を忘れずに書きましょう。
最近のコメント