输入乱码处理

java代码通过java虚拟机(JVM)实现了跨平台运行,为了在不同平台上得到相同的显示结果,java在其内部使用Unicode字符集来表示字符,这样就存在Unicode字符集(JVM内部编码)和本地字符集(实际的文字)进行转换的过程。java代码读取字符书记的时候,需要将本地字符集编码的数据转换为Unicode编码,而在通过java代码向输出流输出字符数据的时候,则需要将Unicode编码转换为本地字符集编码。(说白了就是JVV机器相当于一个转换器,可以读取本地的字符集将其转换成Unicode字符标准,本地通过编码转换成数据流,又可以将数据流转换成本地的字符集标准)
在web应用中有些环节会产生乱码,就我目前所学而言,
1.web容器默认采用的是ISO-8859-1的编码方式解析POST数据,在浏览器提交中文数据后,WEB容器会按照ISO-8859-1字符集来解码数据,而ISO-8859-1字符集编码范围是不能够容下中文字符的,所以这里会导致产生乱码。
2,多数数据库采用的是ISO-8859-1的编码方式,在java程序和数据库之间传递数据时,JDBC驱动程序首先将程序内的Unicode编码格式的数据转换为ISO-8859-1的格式,然后传递到数据库中,在这一环节也可能会导致乱码的产生。
3.JSP页面中的pageEncoding和contentType两种属性的区别:pageEncoding是jsp页面本身的编码,contentType的charset是指服务器发送给客户端的内容编码。
JSP页面从请求执行到结果显示分为三阶段:
第一阶段是jsp编译成JAVA.它会根据pageEncoding的设定读取JSP,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。因此如果JSP页面中包含中文HTML文本,就需要对pageEncoding进行设置,否则在转化过程中就会出现乱码。
第二阶段是通过JAVAC命令编译得到.class。.java到.class的过程采用的是UTF-8的编码方式。
第三阶段是WEB容器载入和执行阶段得到的class输出的结果,也就是在客户端见到的,这时contentType就发挥作用。
综上所述:页面传递中文参数到JSP/Servlet的过程以及JSP/Servlet通过JDBC将中文保存到数据库的过程。
数据库编码乱码的解决方式,在数据库建表的时候指定保存数据的编码方式为支持中文的编码,或者通过数据库配置文件指定默认的编码方式为支持中文的编码方式。
POST请求处理
1.在JSP中设置编码方式

<%@ page language="java"contentType="text/html"; charset="utf-8" pageEncoding="utf-8"%>

2.从请求对象中取参数前设置编码方式
request.setCharacterEncoding(“utf-8”);

request.setCharacterEncoding("utf-8");

在JSP/Servlet通过HttpServletRquest对象调用getParameter()方法取POST方式传递的参数值之前调用setCharacterEncoding()方法,如果顺序颠倒了还是会产生乱码,例如下面的代码param的值如果是中文会出现乱码:
String param= request.getParameter(“param”);
request.setCharacterEncoding(“utf-8”);
GET请求处理
GET方式的请求参数是通过URL传递参数值。
1.在需要传递中文的地方将本地字符编码

<a href="Test?key=<%=URLEncoder.encode("中文","UTF-8")%>">测试</a>

使用URLEncoder的encode()方法,第一个参数是需要编码的本地字符,第二个参数是编码方式。经过encode方法编码后“中文”变成“%E4%B8%AD%E6%96%87”在地址栏中输出
2.修改Tomcat的Servlet.xml文件
打开Tomcat的Servlet文件找到如下代码,其中的port的值也可能是8080或者其他用户自定义的HTTP请求端口:

<Connector connectionTimeout = "20000" port="80" proocol="HTTP/1.1" redirectPort="8443"/>
<Connector URIEncoding ="UTF-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/> 

设置过滤器处理输入中文乱码
POST方式的乱码处理每次在Servlet的方法中取值之前调用setCharacterEncoding()会显得代码很臃肿,因此可以使用过滤器来完成相同的工作。

@WebFilter("/*")
public class  EncodingFilter implements Filter{
     
     public void destroy(){
     System.out.println("中文编码验证过滤器销毁");//过滤器销毁方法
    
     public void doFilter(ServletResponse request,ServletResponse response,FilterChain chain)throws IOException, ServletException{
      request.setCharacterEncoding("utf-8");
      chain.doFilter(request,response);
//对文件进行编码处理
}
public 	void init(FilterConfig fConfig)throws ServletException{
System.out.println("中文编码过滤器启动");
//编码过滤器初始化方法
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值