Java 如何在Velocity上配置UTF-8?

Java 如何在Velocity上配置UTF-8?,java,servlets,character-encoding,velocity,Java,Servlets,Character Encoding,Velocity,使用Java、servlet、MySQL、Tomcat和Velocity,采取了以下步骤: velocity.properties: input.encoding=UTF-8 output.encoding=UTF-8 server.xml URIEncoding=UTF-8 字符集 meta http equiv=“Content Type”Content=“text/html;CHARSET=UTF-8” eclipse属性、项目属性、文件和编辑器编码 设置所有适用于UTF-

使用Java、servlet、MySQL、Tomcat和Velocity,采取了以下步骤:

  • velocity.properties:
    • input.encoding=UTF-8
    • output.encoding=UTF-8
  • server.xml
    • URIEncoding=UTF-8
  • 字符集
    • meta http equiv=“Content Type”Content=“text/html;CHARSET=UTF-8”
  • eclipse属性、项目属性、文件和编辑器编码
    • 设置所有适用于UTF-8的选项
  • JDBC连接:
    • db.url=jdbc:mysql://://?useEncoding=true&characterEncoding=UTF-8
  • java/servlet代码:
    • 请求。setCharacterEncoding(UTF-8)
所有这些都不起作用。直到完成以下代码:

private String getParameter(String key) {
    String param = request.getParameter(key);
        if (Util.isNotEmpty(param)) {
            try {
                return new String(param.getBytes("8859_1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return param;
        }
    return null;
}
以上说明
request.setCharacterEncoding
没有效果(
getCharacterEncoding()
返回UTF-8);知道请求包装器包装在
ThreadLocal
对象中


这是如何导致的,我如何解决它?

要正确解释参数,需要tomcat将URL解析为UTF-8。在server.xml连接器属性中设置,例如:

<Connector port="8080"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000" 
               disableUploadTimeout="true" 
               URIEncoding="UTF-8"/>

要正确解释参数,tomcat需要将URL解析为UTF-8。在server.xml连接器属性中设置,例如:

<Connector port="8080"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000" 
               disableUploadTimeout="true" 
               URIEncoding="UTF-8"/>


您将获得在浏览器认为正确的编码中编码的参数。不过,问题可能是基于奇怪的浏览器配置或xml头,如果这曾经是带有iso编码的XHTML,则可能需要xml头。

您将获得在浏览器认为正确的编码中编码的参数。不过,问题可能是基于奇怪的浏览器配置或xml头,如果这曾经是带有iso编码的XHTML,则可能需要xml头。

症状表明您(或Velocity)没有在HTTP响应
内容类型
头中设置
字符集
属性。请注意,当通过HTTP提供页面服务时,
标记被忽略。相反,将使用HTTP响应内容类型头的charset属性(如果有)。
标记仅在用户将网页保存到其本地磁盘,然后通过
文件://
从磁盘查看网页时使用。您的问题可能需要在Velocity方面得到解决。好的,所以我扩展了VelocityLayoutServlet只是为了设置响应字符编码,并打印标题以获得“Content-Type:text/html;charset=UTF-8”。正如我在最初的帖子中提到的(在管理员编辑之前),这个问题是从客户端到服务器发生的,而不是从另一个角度,即在保存表单数据时发生的,因此,上面定义的函数具有积极的效果。感谢症状表明您(或Velocity)没有在HTTP响应
内容类型
标题中设置
字符集
属性。请注意,当通过HTTP提供页面服务时,
标记被忽略。相反,将使用HTTP响应内容类型头的charset属性(如果有)。
标记仅在用户将网页保存到其本地磁盘,然后通过
文件://
从磁盘查看网页时使用。您的问题可能需要在Velocity方面得到解决。好的,所以我扩展了VelocityLayoutServlet只是为了设置响应字符编码,并打印标题以获得“Content-Type:text/html;charset=UTF-8”。正如我在最初的帖子中提到的(在管理员编辑之前),这个问题是从客户端到服务器发生的,而不是从另一个角度,即在保存表单数据时发生的,因此,上面定义的函数具有积极的效果。谢谢