ContentTypeのCharasetテスト(Grails 0.5)
GSPファイルにContentTypeを設定して、どうなるかをチェックしてみた。まあ、Grailsというよりもsitemeshのテストになるのかな。sitemeshってあまりよく知らないので。
アプリケーションとしては、昨日のサンプルを使用。Grailsは0.5にpageEncodingディレクティブのパッチを当てたものに、ロケールによりビューを変えるプラグインをインストールしたものを使用する。まっさらなGrailsだと以下のとおりにやっても動かないので注意。
最初に、新規にコントローラを作成する。
grails create-controller hello
HelloControllerができた。これはこのままで。
次に、grails-app/views/hello/index.gspを以下の内容で作成して、UTF-8で保存する。
<%@ page pageEncoding="utf-8" contentType="text/html;charset=utf-8" %> <html> <head> <meta name="layout" content="hello" /> <title>こんにちは</title> </head> <body> <div class="body"> よく来たな、まあ座れや。 </div> </body> </html>
次はレイアウトファイルだ。grails-app/views/layouts/main.gspを同じディレクトリのhello.gspとしてコピーし、<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>を追加する。次にgrails-app/views/layouts/hello_ja.gspを以下の内容で作成してMS932で保存する。main.gspにちょっと手を入れただけだ。
<%@ page contentType="text/html;charset=windows-31j" pageEncoding="windows-31j" %> <html> <head> <title><g:layoutTitle default="Grails" />(日本語レイアウト)</title> <meta http-equiv="Content-Type" content="text/html;charset=Windows-31j"/> <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}"></link> <g:layoutHead /> <g:javascript library="application" /> </head> <body> <div id="spinner" class="spinner" style="display:none;"> <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" /> </div> <div class="logo"><img src="${createLinkTo(dir:'images',file:'grails_logo.jpg')}" alt="Grails" /></div> (日本語レイアウト) <g:layoutBody /> </body> </html>
ブラウザの言語が日本語の場合には、日本語のレイアウトでMS932で出力され、ブラウザの言語がenとかの場合には、utf-8で出力される。
レイアウトのcharsetと、ビューのcharsetが異なる場合(hello_ja.gspはMS932で、index.gspはutf-8だ)、レイアウトのcharsetとなるみたいだ。ここで気になるのはmetaタグのContent-Typeだ。レイアウトのcharsetが有効となるならば、metaタグはレイアウトに入れるのが妥当な気がする(そんなわけでレイアウトファイルに入れてある)。
「ビューのcharsetが言語ごとに変わってもフォームのパラメタはどうすんのよ?」というアナタ。アナタは正しい。さあ、どうしましょう?