Servlet中文乱码 Tomcat8

问题:

Servlet中Get和Post获取到的中文参数都变成了乱码

代码:

JSP:
    <meta charset="UTF-8">
    <html>
    <body>
    <h2>Hello World!</h2>
    <form action="/login" method="post">
        username:<input type="text" name="username"><br/>
        pwd:<input type="password" name="pwd"><br/>
        <input type="submit" value="login" />
    </form>
    </body>
    </html>

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    String pwd = request.getParameter("pwd");
    System.out.println(username + " " + pwd);
}

截图:

clipboard.png
clipboard.png

尝试方法:

如图 request使用setCharacterEncoding设置为了UTF-8 并且当前页面编码也是UT-8 JSP文件也加入了UTF-8的编码声明 环境用的是Tomcat8
阅读 5.3k
5 个回答

修改下conf下server
clipboard.png

  1. 应该尽量避免在URL中使用非ASCII 字符,不然可能会碰到乱码问题,最好在我们的服务器端设置中的URIEncoding 和useBodyEncdingForURI 两个参数
  2. 一定要在第一次调用request.getParameter 方法之前就设置request .setCharacterEncoding(charset),否则你的POST 表单提交上来的数据也可能出现乱码

很尴尬.... 浏览器默认采用了ASCII进行解码, 调整浏览器解码方式为UTF-8即可

检查一下编码

  • 打开文件
  • 修改编码
code
by soarkey

java文件,jsp文件编码方式最好都统一使用UTF-8编码。

对于post请求
设置request .setCharacterEncoding(“UTF-8”),这样中文才不会有乱码!

你可以统一写一个过滤器设置一下,如果使用spring-mvc的话 可以在web.xml中配置

<filter>
        <filter-name>CharacterEncodingFilter</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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

对于get请求
如果你的请求是get,参数有中文的,比如 ?name=张上,按照如下处理
前端encodeURIComponent(encodeURIComponent(url)),对url进行二次编码。
后端:拿到参数值,使用URLDecoder.decode(s, "UTF-8")解码一下。这样方式确实可行的,答主在实际项目总使用过。
举个例子吧:
前端:

<script type="text/javascript">
   var url = "/xxx/param/test";
     
     var name = "张上";
     
     name = encodeURIComponent(name);
     name = encodeURIComponent(name);//二次编码
     alert(name);
     url = url + "?name="+name;
     window.location.href = url;
     </script>

后端:

@Controller
@RequestMapping(value="/param")
public class ParamController extends BaseController<ParamEntity> {
    /**
     * @throws UnsupportedEncodingException 
     * 
     */
    @RequestMapping(value="/test",method=RequestMethod.GET)
    public String test(@RequestParam("name") String name) throws UnsupportedEncodingException{
        name = URLDecoder.decode(name, "UTF-8");//实测,可以正确的得到中文。
        System.out.println(name);
        return "index";
    }
}

注意:get请求有中文参数,可以指定容器使用何种编码规则来解码提交的参数(有人回答使用这种方式,即修改tomcat 配置文件中的Connector中的URIEncoding参数),但是这种做法不建议使用,推荐使用二次编码吧。
为什么需要二次编码?可以看如下博文:
eURIComponent编码2次

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进