首页 文章

为什么POST不尊重charset,但是AJAX请求呢? tomcat 6

提问于
浏览
23

我有一个基于tomcat的应用程序,需要提交一个能够处理utf-8字符的表单 . 通过ajax提交时,数据从utf-8中的getParameter()正确返回 . 通过表单发布提交时,数据将从iso-8859-1中的getParameter()返回 .

我使用了fiddler,并确定了请求的唯一区别,是 charset=utf-8 被附加到ajax调用中 Content-Type 头的末尾(正如预期的那样,因为我明确地发送了内容类型) .

来自ajax的ContentType:“application / x-www-form-urlencoded; charset = utf-8”

来自表单的ContentType:“application / x-www-form-urlencoded”

我有以下设置:

ajax post(正确输出字符):

$.ajax( {
  type : "POST",
  url : "blah",
  async : false,
  contentType: "application/x-www-form-urlencoded; charset=utf-8",
  data  : data,
  success : function(data) { 
  }
 });

表格帖子(在iso中输出字符)

<form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">

xml声明:

<?xml version="1.0" encoding="utf-8"?>

文档类型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

元标记:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

jvm参数:

-Dfile.encoding=UTF-8

我也试过使用 request.setCharacterEncoding("UTF-8"); 但似乎tomcat只是忽略它 . 我没有使用RequestDumper阀门 .

根据我的阅读,POST数据编码主要取决于表单所在的页面编码 . 据我所知,我的页面在utf-8中正确编码 .

此页面中的示例JSP正常工作 . 它只是使用 setCharacterEncoding("UTF-8"); 并回显您发布的数据 . http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

总而言之,post请求不会将charset作为utf-8发送,尽管页面在utf-8中,表单参数指定utf-8,xml声明或其他任何内容 . 我已经花了三天的时间来完成这项工作,但我的想法已经不多了 . 谁能帮我?

5 回答

  • 0

    form post(在iso中输出chars)<form id =“leadform”enctype =“application / x-www-form-urlencoded; charset = utf-8”method =“post”accept-charset =“utf-8”action = “{//应用程序/路径}”>

    您不需要在那里指定字符集 . 浏览器将使用HTTP响应头中指定的字符集 .

    只是

    <form id="leadform" method="post" action="{//app/path}">
    

    足够 .


    xml声明:<?xml version =“1.0”encoding =“utf-8”?>

    无关紧要 . 它's only relevant for XML parsers. Webbrowsers doesn' t解析 text/html 作为XML . 这仅与服务器端相关(如果您使用的是基于XML的视图技术,如Facelets或JSPX,则在普通JSP上这是多余的) .


    Doctype:<!DOCTYPE html PUBLIC“ - // W3C // DTD XHTML 1.0 Transitional // EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

    无关紧要 . 它's only relevant for HTML parsers. Besides, it doesn' t指定任何字符集 . 相反,将使用HTTP响应头中的那个 . 如果您没有使用像Facelets或JSPX这样的基于XML的视图技术,那么这可以很好 <!DOCTYPE html> .


    meta标签:<meta http-equiv =“Content-Type”content =“text / html; charset = utf-8”/>

    无关紧要 . 仅在从本地磁盘查看HTML页面或在本地解析HTML页面时才有意义 . 相反,将使用HTTP响应头中的那个 .


    jvm参数:-Dfile.encoding = UTF-8

    无关紧要 . 它只与Sun / Oracle(!)JVM有关,可以解析源文件 .


    我也尝试过使用request.setCharacterEncoding(“UTF-8”);但似乎tomcat只是忽略了它 . 我没有使用RequestDumper阀门 .

    这仅在尚未解析请求主体时才起作用(即您尚未事先调用 getParameter() 等) . 你需要尽早打电话 . Filter 是一个完美的地方 . 否则它将被忽略 .


    根据我的阅读,POST数据编码主要取决于表单所在的页面编码 . 据我所知,我的页面在utf-8中正确编码 .

    它依赖于HTTP响应头 .

    您需要做的就是以下三件事:

    • 将以下内容添加到JSP的顶部:
    <%@page pageEncoding="UTF-8" %>
    

    这会将响应编码设置为UTF-8并将响应头设置为UTF-8 .

    • 创建一个 Filter ,它在 doFilter() 方法中执行以下操作:
    if (request.getCharacterEncoding() == null) {
        request.setCharacterEncoding("UTF-8");
    }
    chain.doFilter(request, response);
    

    这将使POST请求正文将被处理为UTF-8 .

    • 更改 Tomcat/conf/server.xml 中的 <Connector> 条目,如下所示:
    <Connector (...) URIEncoding="UTF-8" />
    

    这将使GET查询字符串被处理为UTF-8 .

    另见:

  • 18

    试试这个 :

    How do I change how POST parameters are interpreted?
    

    POST请求应指定它们发送的参数和值的编码 . 由于许多客户端无法设置显式编码,因此使用默认值(ISO-8859-1) . 在许多情况下,这不是首选的解释,因此可以使用ajavax.servlet.Filter设置请求编码 . 编写这样的过滤器是微不足道的 . 此外,Tomcat已经附带了这样的示例过滤器 .

    请看看:

    5.x
    
    webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
    
    webapps/jsp-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
    
    6.x
    
    webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
    

    有关详细信息,请参阅以下URL http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

  • 1

    你试过 accept-charset="UTF-8" 吗?如你所说,数据应该根据页面本身的编码进行编码; tomcat忽略了这一点似乎很奇怪 . 您正在尝试使用哪种浏览器?

  • 0

    您是否尝试在 conf/server.xml 中为HTTP连接器指定 useBodyEncodingForURL="true"

  • 0

    我根据this post中的信息实现了一个过滤器,现在它正在运行 . 但是,这仍然无法解释为什么即使页面是UTF-8,tomcat用来解释它的字符集也是ISO-9951-1 .

相关问题