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が言語ごとに変わってもフォームのパラメタはどうすんのよ?」というアナタ。アナタは正しい。さあ、どうしましょう?