2004年8月5日木曜日

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>




0 件のコメント:

コメントを投稿