我有一个Tapestry应用程序,它从表单中检索数据,将其写入数据库然后显示结果。只要没有使用特殊字符(Ä,Ö,Ü,ß,€......),这一切都很有效。
E.g。文字
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>
我在几个地方检查了我的编码设置:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Tapestry设置(无论如何这应该是默认设置):
tapestry.charset=UTF-8
Firefox说(工具&gt;页面信息:编码):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;
和
@Component(parameters = {"clientValidation=false", "enctype='application/x-www-form-urlencoded; charset=UTF-8'", "accept-charset='utf-8'"})
private Form form;
但两者都没有成功(我正在寻找一般解决方案而不是解决方法)。
有趣的是this proposal适用于某些特殊字符(如ä,ö,ü,ß等),但我不想使用ISO-8859-1。如何将Formstry用于表单的编码设置为UTF-8?我错过了什么或者我的问题有完全不同的原因?
编辑:我在没有数据库的情况下进行了测试,问题仍然存在,所以这不是关于数据库端的错误编码设置。
答案 0 :(得分:3)
确实是我的服务器配置错误。我的web.xml中的以下内容解决了它(当然这也适用于非Spring过滤器)。
<filter>
<filter-name>charsetFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
答案 1 :(得分:0)
我在Tapestry 5.2.6和5.3.0-SNAPSHOT中尝试过你的测试字符串,它运行正常。我能够将它持久化到HSQLDB数据库并按预期将其拉回。
您使用的是哪个版本?如果您回到5.0.x,则可能需要执行以下操作: http://wiki.apache.org/tapestry/Tapestry5Utf8Encoding