Страница входа в мое приложение Tapestry имеет свойство, в котором хранится пароль, который вводит пользователь, который затем сравнивается со значением из базы данных. Если пользователь вводит пароль с многобайтовыми символами, такими как:
áéíóú
... проверка возвращаемого значения getPassword () (абстрактный метод для соответствующего свойства) дает:
áéÃóú
Очевидно, что это не закодировано должным образом. Тем не менее Firebug сообщает, что страница обслуживается в UTF-8, поэтому предположительно запрос на отправку формы также будет закодирован в UTF-8. Проверка значения, полученного из базы данных, дает правильную строку, поэтому она не будет проблемой для кодировки ОС или IDE. Я не переопределил значение по умолчанию для Tapestry для org.apache.tapestry.output-encoding в файле .application, а документация по Tapestry 4 указывает, что значением по умолчанию для свойства является UTF-8.
Так почему же, по-видимому, Tapestry неправильно устанавливает кодировку при установке свойства?
Соответствующий код следует:
login.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>
Login.page
<?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>
Login.java
...
public abstract class Login extends BasePage {
...
public abstract String getPassword();
...
public void attemptLogin() {
// At this point, inspecting getPassword() returns
// the incorrectly encoded String.
}
...
}
Обновление
@ Ян Солтис: Хорошо, если я проверю значение, полученное из базы данных, оно отобразит правильную строку, поэтому может показаться, что мой редактор, ОС и база данных все правильно кодируют значение. Я также проверил мой файл .application; он не содержит запись org.apache.tapestry.output-encoding, а документация Tapestry 4 указывает, что значением по умолчанию для этого свойства является UTF-8. Я обновил описание выше, чтобы отразить ответы на ваши вопросы.
@ себя: решение найдено.