【问题标题】:UTF-8 encoding and http parametersUTF-8 编码和 http 参数
【发布时间】:2026-02-04 06:45:01
【问题描述】:

我正在使用 YahooUI Javascript 库进行简单的 ajax 调用,如下所示:

YAHOO.util.Connect.setForm('myform');
YAHOO.util.Connect.asyncRequest('POST', url, ...);

以下是我的应用程序中的设置: Tomcat版本:6.0.18

Tomcat 服务器连接器:URIEncoding="UTF-8" 网页应用页面:

在 YahooUI 连接器库文档中也有说明:

setForm 将对每个 HTML 表单进行编码 字段的名称和值使用 编码URI组件。这导致一个 UTF-8 编码的字符串,名称-值 对。注意:设置 HTTP 标头 “Content-Type”具有不同的 charset 值不会改变 序列化数据的编码。序列化数据的编码。

我可以看到作为参数发送的法语字符被编码(在 ie7 中使用 iehttpheader 工具):

    name=%C3%88%C3%A0%C3%B4 
    testParam=%C3%B4%C3%B4   

对于数据: 名称:Èàô 和 testParam: ôô

但在服务器端,我看到的值如下: ÈàÃÂ

即使我将字符串转换为字节,然后使用定义如下的字符集创建新字符串: String val = new String(oo.getBytes("UTF-8")); 我无法按预期获得准确的数据。

注意:我已经引用了以下问题,但无法解决此问题:How to get UTF-8 working in Java webapps? 请指导。

更新: 调用 W3.org 网站http://www.w3.org/International/O-URL-code.html 上给出的解码 UTF-8 函数给了我预期的结果。我希望 Tomcat 能够对此进行解码?

【问题讨论】:

    标签: java utf-8 character-encoding


    【解决方案1】:

    由于您使用的是POST 查询,URIEncoding="UTF-8" 在这里不适用。您需要设置一个过滤器来告诉 Tomcat 您的请求编码是 UTF-8。例如,您可以使用 Spring 的 CharacterEncodingFilter (usage, javadoc)。还可以找到此类过滤器的其他实现。

    【讨论】:

    • 是的,这行得通 - 我必须确保我应用的过滤器(SetCharacterEncodingFilter - 在 tomcat 示例文件夹中可用)必须是在我的其他过滤器之前调用的第一个过滤器并且它有效!.谢谢:)
    • 这是另一个使用链接,因为上面的链接似乎已损坏:azizsaboor.wordpress.com/2008/06/10/…
    【解决方案2】:

    是的,这里有一个:

    package com.lfantastico.web;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class EncodingFilter implements Filter {
        private String encoding = "UTF-8";
    
        public void destroy() {
        }
    
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding(encoding);
            response.setCharacterEncoding(encoding);
            chain.doFilter(request, response);
        }
    
        public void init(FilterConfig config) throws ServletException {
            if (config.getInitParameter("encoding") != null) {
                encoding = config.getInitParameter("encoding");
            }
        }
    }
    

    【讨论】:

      最近更新 更多