字符乱码出现的原因及解决办法
1.字符乱码出现的原因:
出现乱码是由于数据在传递和接受过程中字符编码格式不一致导致的。
for examples:
输入11-->在2进制中代表的是3 -->在8进制中代表的是9 -->在16进制中代表的17
在这里同样输入的都是11,但是由于进制的不一样,所以代表的值也不一样。
同理,编码在底层都是一串字节码,由于编码格式的不同,比如以UTF-8编码格式进行编码,以iso8859-1编码格式就无法进行解析,所以所展现出来的字符串就不是原先的字符串了。
2.字符乱码的解决方式
2.1将乱码先进行编码,在进行解码(不管是get请求还是post请求都适用)
String userCount = User.getUserCount(); //将乱码字符串按照错误的编码格式转换为原始的字节码序列 byte[] bs = userCount.getBytes("iso889-1"); //将原始的字节码序列使用正确的编码格式进行编码,转换为正确的文字 userCount = new String(bs,"utf-8");
2.2使用spring框架构建项目的话可以使用编码过滤器(post请求方式)
在web.xml中添加:
<filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encoding</filter-name> <servlet-name>springmvc</servlet-name> </filter-mapping>
<servlet-name>springmvc</servlet-name>说明只要请求被前端控制器拦截到,就会执行这个名称为encoding的filter。
CharacterEncodingFilter的源码如下:
public class CharacterEncodingFilter extends OncePerRequestFilter { /*设置了两个属性encoding和forceEncoding,encoding代表的是编码格式,forceEncoding表示是否启用*/ private String encoding; private boolean forceEncoding = false; public CharacterEncodingFilter() { } public void setEncoding(String encoding) { this.encoding = encoding; } public void setForceEncoding(boolean forceEncoding) { this.forceEncoding = forceEncoding; } protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { /*当编码格式不为空以及forceEncoding为true时,那么设置就将服务器端的编码格式设置为配置文件中设置的编码格式*/ if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
//只能修改请求体中编码方式 request.setCharacterEncoding(this.encoding); if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); } }
所以需要在web.xml中设置encoding和forceEncoding的初始化值
<filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <servlet-name>springmvc</servlet-name> </filter-mapping>
2.3如果是本地的项目的话,可以在tomcat的配置文件server.xml中修改编码格式 (get请求)
<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
在server.xml配置文件下,添加属性URIEncoding="UTF-8"