我有一个 Tapestry 应用程序,它从表单中检索数据,将其写入数据库,然后显示结果。只要不使用特殊字符(ä、Ö、Ü、ß、€ ...),一切都可以正常工作。
例如。文本
TestäöüßÄÖÜ€$
将导致
TestäöüÃÃÃÃâ¬$
我猜这个问题与错误的字符编码设置有关。
Tapestry java 类:
@Component(parameters = {"clientValidation=false"})
private Form form;
@Component(parameters = {"value=someDTO.name"})
private TextField someNameField;
挂毯模板:
<t:form t:id="form">
...
<t:textfield t:id="someNameField"/>
...
</t:form>
我在几个地方检查了我的编码设置:
- HTML 源:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-
Tapestry 设置(无论如何这应该是默认设置):
tapestry.charset=UTF-8
Firefox 显示(工具>页面信息:编码):UTF-8。
-
底层数据库(Oracle)也使用UTF-8:
character_set_system utf8
然后我检查了 POST 请求的标头,有两件事引起了我的注意:
-
标头中未指定内容类型。我期望这样的事情:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
空格用 + 编码,而不是 %20。
我还尝试了以下方法:
@Component(parameters = {"clientValidation=false", "enctype='application/x-www-form-urlencoded; charset=UTF-8'"})
private Form form;
and
@Component(parameters = {"clientValidation=false", "enctype='application/x-www-form-urlencoded; charset=UTF-8'", "accept-charset='utf-8'"})
private Form form;
但两者都没有成功(我正在寻找通用解决方案而不是解决方法)。
有趣的是这个提案适用于一些特殊字符(如 ä、ö、ü、ß 等),但我不想使用 ISO-8859-1。如何将 Tapestry 用于表单的编码设置为 UTF-8?我错过了什么或者我的问题是否有完全不同的原因?
EDIT:我在没有数据库的情况下进行了测试,问题仍然存在,所以这与数据库端的错误编码设置无关。