Tapestry:字符编码问题

时间:2011-07-22 11:18:46

标签: forms utf-8 character-encoding tapestry

我有一个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>

我在几个地方检查了我的编码设置:

  1. HTML来源:
  2.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    
    1. Tapestry设置(无论如何这应该是默认设置):

      tapestry.charset=UTF-8
      
    2. Firefox说(工具&gt;页面信息:编码):UTF-8。

    3. 底层数据库(Oracle)也使用UTF-8:

      character_set_system    utf8
      
    4. 然后我检查了POST请求的标题,引起了我的注意:

      1. 标头中未指定内容类型。我希望这样的事情:

        Content-Type: application/x-www-form-urlencoded; charset=UTF-8
        
      2. 空格用+而不是%20编码。

      3. 我也尝试了以下内容:

        @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?我错过了什么或者我的问题有完全不同的原因?

        编辑:我在没有数据库的情况下进行了测试,问题仍然存在,所以这不是关于数据库端的错误编码设置。

2 个答案:

答案 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