2004年08月05日
SledgeでのURLエンコード
GETリクエストの引数に日本語を渡したい場合、文字列をURLエンコードしなければなりませんが、Sledgeで、出力ページをEUC以外にしていると、URIエンコードにひと工夫必要になります。 出力ページがEUCの場合は、Template::Toolkitに標準でついているURIフィルターを使って
<a href="search?q=[% r.param('query')| uri %]">
検索結果のリンク</a>
こんな風に簡単にURLエンコードできますが、EUC以外の場合は単純に上のようにしても、文字化けが起こってしまいます。これは、Sldgeは内部で扱う文字コードをEUCに統一していて、外部からの入力データは受け取り時にEUCに変換され、コンテンツのアウトプット時にテンプレートの値が埋め込まれた完全なEUCのHTMLを作成してからそれを指定の文字コードに変換して出力しているためです。
このため、上記のような方法でURLエンコードを行うと、指定の文字コードに変換される前に、つまり、文字コードがEUCの状態でURLエンコードが行われてしまうため、おかしなことになってしまうのです。
この問題を回避するには、URLエンコードを行う前に指定の文字コードへ変換する必要があります。
<a href="search?q=[% r.param('query')| 文字コードの変換 | uri %]">
検索結果のリンク</a>
最初は自分で文字をエンコードするためのプラグインを書いて使っていましたが、CPANを探してみるとすでにいい感じものがありました。
Template::ToolkitでJcodeを利用可能にするためのプラグインです。時代はEncodeだと言われそうですが、utf8を扱わないのであれば、これで十分ですね。使い方はこんな感じです。
[% USE Jcode %]
<a href="search?q=[% r.param('query').jcode('euc').sjis | uri %]">
検索結果のリンク</a>
Continuing the discussion...
このエントリーのトラックバックURL:
http://hori-uchi.com/mt/trackback/182
このリストは、次のエントリーを参照しています: SledgeでのURLエンコード:
hori-uchi.com: SledgeでのURLエンコード GETリクエストの引数に日本語を渡したい場合、文字列をURLエンコードしなければなりませんが、S...
from ここギコ! at 2005年01月03日 00:04
結局原因判らず&解決できずじまい。 その後もlogrotateについて調べて、コマンドラインで-vオプションをつけて実行すると詳細の実行時メッセージを出してくれ...
from ここギコ! at 2005年01月03日 00:14
