如何才能通过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 UTF-8 String Java Servlet
很多文章绝大多数上都把两者混为一谈,有时候得到的结果是对的,因为刚好在某些点上兼容了,但原理是错的。
比如你上面的问题,出问题的地方不止一个,所以你会得到似是而非的结论。
首先
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 就可以了。