web开发中文乱码问题总结

来源:互联网 发布:云计算工程师的收入 编辑:程序博客网 时间:2022/05/27 13:30

首先应该明白jsp页面两个与编码有关的参数的作用:
1、pageEncoding:用于指定jsp页面的编码格式,
pageEncoding指定文件保存的格式,由于JVM内部是使用的unicode编码格式,容器在编译JSP时
会根据pageEncoding指定的编码格式将文件内容转换为unicode的格式,
如果没有指定pageEncoding就默认使用charset的编码格式

2、contentType="text/html;charset=UTF-8"
charset的作用有两个,一是从服务器返回到浏览器时,指示浏览器以charset指定的编码格式显示内容,
另一个作用是,当我们在页面上填写完数据提交时,浏览器会将数据转换为charset指定的格式传给服务器。
charset默认的编码格式为ISO-8859-1


post方式传递参数

post方式的数据是通过Http请求头传给Servlet的,Servet容器在获取这些数据时,如通过getParameter()方法获取数据,容器会根据request.getCharacterEncoding()指定的编码格式来解析接收数据,
如果getCharacterEncoding()==null(默认情况正式如此,http协议没有传递编码信息给服务器)一般就默认使用ISO-8859-1。
如果我们在页面指定的charset编码不是ISO-8859-1也没有通过setetCharacterEncoding()指定编码格式,那么乱码问题就会产生了。
比如你在页面上面设定charset=UTF-8,现在有一个参数是三个汉字,那么UTF-8的编码就会有六个字节的数据,
此时容器用ISO-8859-1来解析数据,而ISO-8859-1是单字节的编码,
本来是两个字,容器却解析为六个,乱码问题由此就产生了。

解决这类乱码的方法是通过配置一个编码过滤器来指定编码格式:

public class EncodingFilter implements Filter {

 public EncodingFilter() {
 }

 public void init(FilterConfig parm1) throws javax.servlet.ServletException {
 }

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws java.io.IOException,
   javax.servlet.ServletException {

       
  request.setCharacterEncoding("UTF-8");

  chain.doFilter(request, response);
 }

 public void destroy() {
 }
}

url或者get方式传递参数
 
  首先应该尽量避免使用这种方式传递中文参数,如果需要传递中文参数比较可靠的做法
  在传递参数时使用URLEncoder.encode()对传递的参数进行编码,然后在参数使用端使用URLDecoder.decode()进行解码

原创粉丝点击