[Servlet] Java Web乱码

来源:互联网 发布:网络炒作事件 编辑:程序博客网 时间:2024/06/08 18:39

乱码

先看一个简单的例子:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    OutputStream out = response.getOutputStream();    String data = "中文";    out.write(data.getBytes("utf-8"));}

当访问时界面输出乱码,这主要是因为程序用UTF-8编码,而浏览器默认采用GBK解码。

其实乱码问题出现的根本原因也就是编码和解码不一致产生的。

常见的编码

  • UTF-8:国际编码
  • GBK:中文编码,是GB2312的扩展,除了兼容GB2312外,还能显示繁体中文、还有日文的假名
  • ISO8859-1:tomcat默认,不支持中文

通过浏览器调用Servlet,页面显示乱码

response乱码

解决方法:response.setContentType("text/html;charset=utf-8");或者response.setHeader("content-type", "text/html;charset=utf-8");

原理:告诉浏览器用utf-8进行解析。

看下面两种情况:

  • 情况一

    问题代码如下:

    OutputStream out = response.getOutputStream();String data = "博客";out.write(data.getBytes("UTF-8"));
    • 乱码流程图

    乱码流程图

    • 解决方案流程图

  • 情况二

    问题代码如下:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter();String data = "博客";out.println(data);}

    浏览器输出的结果为??

    这是因为“博客”首先被封装在response对象中,因为IE和WEB服务器之间不能传输文本,然后就通过ISO-8859-1编码进行编码,但是ISO-8859-1中没有“博客”的编码,因此输出“??”,表示没有编码。

    • 错误代码流程图

    • 解决方案流程图

request乱码问题

  • POST请求

    • 乱码流程图

    • 解决方案

  • GET请求

    问题本质是get方式传递的参数内容默认编码方式为ISO-8895-1,而且使用request.setCharacterEncoding(“utf-8”)也无法解决问题,现提供一种解决方法如下:

    String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8");

    即先将字符串用ISO-8859-1编码成字节数组,然后用UTF-8编码将字节数组转换成字符串输出。

    流程图如下:

参考

本文主要图片和内容来自博客。

原创粉丝点击