首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

怎么才能通过POST或GET正确获得中文输出

2013-09-06 
如何才能通过POST或GET正确获得中文输出?servlet:package cc.openhomeimport java.io.BufferedReaderimp

如何才能通过POST或GET正确获得中文输出?
servlet:


package cc.openhome;

import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/encoding")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
    
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
    String name = request.getParameter("nameGet");
    name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
    
    PrintWriter out = response.getWriter();
    response.setContentType("text/html;charset=utf-8");
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hello</title>");
    out.println("</head>");
    out.println("<body>" + name + "</body>");
    out.println("</html>");
}
    /**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
    @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
    request.setCharacterEncoding("UTF-8");


    String name = request.getParameter("namePost");

    PrintWriter out = response.getWriter();
    response.setContentType("text/html;charset=utf-8");
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hello</title>");
    out.println("</head>");
    out.println("<body>" + name + "</body>");
    out.println("</html>");
}

}



html:



用post的效果:
怎么才能通过POST或GET正确获得中文输出 HTML UTF-8 String Java Servlet
[解决办法]
引用:
Quote: 引用:

别忘了 tomcat的server.xml里默认 URIencoding 是ISO-8859, 必须改成utf-8。
其他服务器也有类似设置。

   
     String name = request.getParameter("nameGet");
        name = new String(name.getBytes("ISO-8859-1"), "UTF-8");




这段铁定错。
首先,name在getParameter时已经按服务器设置的URIencoding解码完毕了。直接拿去输出就好了。
其次,name按照ISO解码成字节。这个字节流显然不是合法的UTF8字节流,铁定乱码。




呃。。不对喔。。GET的话不加getBytes真的会乱码喔。。。我试过。。他是专门用于get方法的,《JSP&Servlet学习笔记》上是这样说的。。。



明显显示是乱码;

如果我写上getBytes:


你还是没看明白。
uri解码跟你使用的服务器有关,你用tomcat的话先检查server。xml里的设置!
字符串到java servlet那里URI已经是被解码过了一遍了。
encoding有两层,
一层意思叫URL encoding是按RFC 3986 标准。另外URL本身也有编码标准。
另一层意思是字符集的二进制转换UTF-8,ISO8895 等。


很多文章绝大多数上都把两者混为一谈,有时候得到的结果是对的,因为刚好在某些点上兼容了,但原理是错的。

比如你上面的问题,出问题的地方不止一个,所以你会得到似是而非的结论。
首先
String name = request.getParameter("nameGet");
System.out.println(name);//加上

如果name print出来是对的。
那么浏览器上得到输出应该不会是乱码。

如果name输出不正常,说明你server的解码没设对。
浏览器对URL的编码标准是UTF-8。如果server的解码设的是ISO8895 的话
那必然name print出来是乱码。
这里的过程是这样的,浏览器发送字串name-》编码成UTF-8 bytes-》bytes 》被server按ISO解读-》乱码字串name。
接下来,你的servlet把 
乱码字串name -》编码成 ISO bytes-》bytes 》被按UTF-8解读 -》正常字串name -》输出到response

看到问题了吗,这个字串被来来回回套了两层编码,这完全是不必要的。
如果服务器设置是对的话,这个过程应该是这样的。

浏览器发送字串name-》编码成UTF-8 bytes-》bytes 》被server按UTF-8解读-》正常字串name 
然后,你的servlet里 只需要 正常字串name -》输出到response 就可以了。

热点排行