私の Tapestry アプリケーションのログイン ページには、ユーザーが入力したパスワードが格納されるプロパティがあり、データベースの値と比較されます。ユーザーが次のようなマルチバイト文字を含むパスワードを入力した場合:
áéíóú
... getPassword() (対応するプロパティの抽象メソッド) の戻り値を調べると、次のようになります。
áéÃóú
明らかに、それは適切にエンコードされていません。それでも Firebug は、ページが UTF-8 で提供されると報告しているため、おそらくフォーム送信要求も UTF-8 でエンコードされるでしょう。データベースからの値を検査すると、正しい文字列が生成されるため、OS または IDE エンコーディングの問題ではないようです。.application ファイルの org.apache.tapestry.output-encoding の Tapestry のデフォルト値をオーバーライドしていません。また、Tapestry 4 のドキュメントには、プロパティのデフォルト値が UTF-8 であることが示されています。
では、Tapestry がプロパティを設定するときにエンコーディングを失敗しているように見えるのはなぜでしょうか?
関連するコードは次のとおりです。
ログイン.html
<html jwcid="@Shell" doctype='html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"' ...>
<body jwcid="@Body">
...
<form jwcid="@Form" listener="listener:attemptLogin" ...>
...
<input jwcid="password"/>
...
</form>
...
</body>
</html>
ログインページ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification
PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
<page-specification class="mycode.Login">
...
<property name="password" />
...
<component id="password" type="TextField">
<binding name="value" value="password"/>
<binding name="hidden" value="true"/>
...
</component>
...
</page-specification>
ログイン.java
...
public abstract class Login extends BasePage {
...
public abstract String getPassword();
...
public void attemptLogin() {
// At this point, inspecting getPassword() returns
// the incorrectly encoded String.
}
...
}
アップデート
@Jan Soltis:データベースから取得した値を調べると、正しい文字列が表示されるので、エディター、OS、およびデータベースがすべて値を正しくエンコードしているように見えます。.application ファイルも確認しました。org.apache.tapestry.output-encoding エントリが含まれておらず、Tapestry 4 のドキュメントには、このプロパティのデフォルト値が UTF-8 であることが示されています。あなたの質問への回答を反映するために、上記の説明を更新しました。
@myself: 解決策が見つかりました。