UTF-8使用Tomcat编码servlet表单提交

Par*_*ker 8 java tomcat servlets jetty utf-8

我正在尝试将包含unicode字符的简单表单发布到servlet操作.在Jetty上,一切都没有障碍.在Tomcat服务器上,utf-8字符会被破坏.

我得到的最简单的案例:

形成:

<form action="action" method="post">
  <input type="text" name="data" value="It’s fine">`
</form>`
Run Code Online (Sandbox Code Playgroud)

行动:

class MyAction extends ActionSupport {   
  public void setData(String data) {
    // data is already mangled here in Tomcat
  } 
}
Run Code Online (Sandbox Code Playgroud)
  • <Connector>在server.xml中有URIEncoding ="UTF-8"
  • 动作的第一个过滤器调用request.setCharacterEncoding("UTF-8");
  • 包含表单的页面的内容类型是"text/html; charset = UTF-8"
  • 在表单中添加"accept-charset"没有任何区别

我能使其工作的唯一两种方法是使用Jetty或将其切换为method ="get".这两个都导致角色没有问题.

Bal*_*usC 17

<Connector>在server.xml中有URIEncoding ="UTF-8"

这仅与GET请求相关.


动作调用的第一个过滤器 request.setCharacterEncoding("UTF-8");

好的,应该适用于POST请求.你只需要确保,如果你还没有叫getParameter(),getReader(),getInputStream()或其他任何这将触发解析请求主体之前调用setCharacterEncoding().


包含表单的页面的内容类型是 "text/html; charset=UTF-8"

究竟是如何设置它的?如果在a中完成<meta>,那么您需要了解当页面通过HTTP提供并且存在HTTP 响应头时,浏览器会忽略Content-Type它.平均网络服务器默认已经设置了它.该<meta>内容类型时,将页面保存到本地磁盘,并从那里看,然后才能使用.

要正确设置响应标头字符集,请将以下内容添加到JSP的顶部:

<%@page pageEncoding="UTF-8" %>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这也会告诉服务器在给定的字符集中发送响应.


在表单中添加"accept-charset"没有任何区别

它只会在MSIE中产生差异,但即便如此,它也会错误地使用它.无论如何,整个属性都是毫无价值的.算了吧.

也可以看看: