`

乱码的原因和处理

 
阅读更多

                                               乱码的原因和处理

 1.乱码原因:

          造成乱码的原因主要是前端页面的编码格式和服务端编码格式的不同,这就造成了对中文处理时发生乱码。我们常用的编码字符集有一下几种:

1.ISO-8859-1:只取一个字节
2.GBK-GB2312:汉字占用2个字节
3.UTF-8:一个汉字占用3个字节

所以ISO编码是不能用来存储中文的。我们要使用GBK或UTF-8,这样中文编码过程为:

        浏览器(输入):

        我是乱码----通过GBK进行编码得到:aabbcc-----通过ISO进行编码得到:112233       这个过程是浏览器自动执行的

       程序员最终获得的数据是112233,如果后台(代码里)使用的是utf-8,那么将112233通过utf-8解码是得不到正确的中文的。

2.解决办法:

1.对页面后台进行统一字符。例如在JSP中将pageEncoding设置为GBK,那么在Myeclipse中将项目的编码格式也指定为GBK。那么程序员就能得到aabbcc在使用GBK解码就能得到正确的中文。

缺点:只对Post提交方式有用。因为pageEncoding这个只对post起作用。get方法提交时,大家可以从地址栏里看到提交的参数,这是因为get方法传递是作为报文头提交的,而 pageEncoding对报文头是没有作用的,所以仍然按照 iso8859-1编码,才出现了刚才的乱码问题。而post提交的是form表单的内容,pageEncoding指定了它的编码,所以他会按照指定编 码传递。

2.从过程上进行解决:

         程序员(获得):

        得到112233---进行ISO解码得到:aabbcc------在通过GBKj解码得到:我是乱码

这样的话就不会造成乱码了。

若后台(代码)使用的是GBK,那么还原过程:
String msg = request.getParameter("msg");
byte[] newMsg = msg.getBytes("ISO-8859-1");//通过ISO-8859-1获得该字符串的字节数组
String res = new String(newMsg, "GBK");

这种办法对get和post都适用。

3.在后台(代码中)直接指定request和response的编码格式,使之和前端(JSP)里的编码格式一样

  response.setContentType("text/html; charset=GB2312");

  request.setCharacterEncoding("GBK");

缺点:和用pageEncoding一样只适用于post方式

5.使用过滤器(对取得的值直接进行编码转换,这种方法对get和post都适用)
具体操作:
1.在web.xml文件中 在servlet前添加过滤器filter:

 

<filter>
      <filter-name>EncodingFilter</filter-name>
      <filter-class>com.filter.EncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>EncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
 2.定义自己的request和response

 

 

/*
 * 该类用来定义自己的request,彻底解决request的乱码问题,同理可以完成response的乱码问题
 */
public class MyRequestWrapper extends HttpServletRequestWrapper{
	private String charset;
	public MyRequestWrapper(HttpServletRequest request) {
		super(request);
		
	}
	public MyRequestWrapper(HttpServletRequest request, String charset) {
		super(request);
		this.charset = charset;
	}

	@Override
	public String getParameter(String na) {
		String value = null;
		
		
	    try {
	    	if(super.getParameter(na)!=null){
	    		value = new String(super.getParameter(na).getBytes("iso-8859-1"),charset);
	    	}
		} catch (UnsupportedEncodingException e) {
		
			e.printStackTrace();
		}
		
		return value;
		
	}


	

}
 
 3.新建一个类 实现Filter接口,将ServletRequest,ServletResponse转化成HttpServletRequest 和 HttpServletResponse

 

/*
 * 该类用来进行编码转换
 */

public class AuthorityFilter implements Filter
{
	private String charset;

	public void destroy() {
		
	}
         
  //放行所有请求和响应
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest)request;//强制转换httpservlet
		HttpServletResponse resp = (HttpServletResponse) response;
		//req.setCharacterEncoding("UTF-8");直接设置编码格式
		req.setCharacterEncoding(charset);//通过xml配置编码格式
		
		if(charset != null){
			req = new MyRequestWrapper(req, charset);
		}
	
		chain.doFilter(req, resp);//放行所有请求和响应,必须使用转换后的req,resp,否则编码没有转换
	}



	//有条件的放行,对于登录页面不放行
	public void doFilter2(ServletRequest req, ServletResponse resp,
			FilterChain filterChain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		
		String path = request.getContextPath();
		String uri = request.getRequestURI();
		
		String str = uri.substring(path.length());
		HttpSession session = request.getSession();
		
		if(str.startsWith("/system") && !str.endsWith("login.jsp")){
			if(session.getAttribute("user") == null){
				response.sendRedirect("login.jsp");
			}
		}
		
		//放行
		filterChain.doFilter(request, response);
	}
        //设置转换编码格式
	public void init(FilterConfig filterConfig) throws ServletException {
		 this.charset = filterConfig.getInitParameter("encoding");
	}
	
}
 

 

 

 

 

 

分享到:
评论

相关推荐

    mysql数据乱码的原因及处理办法

    这是我积累的关于mysql的数据乱码的一写经验,有兴趣的可以看看

    SecureCRT显示乱码处理方法

    SecureCRT操作指令时,显示一些乱码,原因在于我们的Linux系统字符编码默认是UTF-8这种格式的!要将SecureCRT也设置成UTF-8才能进行正常显示。附件描述了如何配置。

    Java乱码问题解决

    造成这种问题的根本原因是Java中默认的编码方式是Unicode,而中国人通常使用的文件和DB都是基于GB2312或BIG5等编码,故会出现此问题。 对于不同的问题,不同的JDK版本,不同的应用服务器(如Tomcat,Jboss,...

    邮件乱码处理

    造成电子邮件乱码的原因有很多,文档中提供常出现错误乱码解决方法!

    mysql乱码处理

    mysql乱码处理,MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如php)的连线语系设定问题 强烈建议使用...

    Java编程汉字乱码原因分析及解决方法研究.pdf

    java程序输入输出汉字时常常出现乱码现象,针对这一异常,本文首先介绍了java和JSP文件编译时对汉字字符处理的基本原理,接着分析了java程序与其他媒介交互时产生乱码现象的根本原因,最后针对产生异常的每种情况给出了...

    【servlet】彻底解决doGet、doPost以及控制台中文乱码问题

    我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。 思维导图: 1. 应答乱码处理(response输出页面时乱码) 1.1 ...

    Python网络爬虫出现乱码问题的解决方法

    如源网页为gbk编码的字节流,而我们抓取下后程序直接使用utf-8进行编码并输出到存储文件中,这必然会引起乱码 即当源网页编码和抓取下来后程序直接使用处理编码一致时,则不会出现乱码; 此时再进行统一的字符编码也...

    nodejs和C语言插入mysql数据库乱码问题的解决方法

    在这里记录了nodejs过程中的一些乱码情况,这里的乱码主要是由于网页的编码方式与nodejs的默认解码方式...原因是nodejs默认处理字符是utf8,而mysql默认是latin1,毕竟是欧洲人开发的数据库。分析如下  命令show var

    彻底搞懂 python 中文乱码问题(深入分析)

    曾几何时 Python 中文乱码的问题困扰了我很多很多年,每次出现中文乱码都要去网上搜索答案,虽然解决了当时遇到的问题但下次出现乱码的时候又会懵逼,究其原因还是知其然不知其所以然。现在有的小伙伴为了躲避中文...

    Jsp编程中文乱码剖析.doc

    字符集编码的识别与转换、分析各种乱码产生的原因、编程操作各种编码字符串(例如字符数计算、截断处理)等都需要弄清楚编码的特性。了解一种字符集编码主要是要了解该编码的编码范围,编码对应的字符集(都包含哪些...

    URI:Escape模块,awstats搜索的关键字的乱码问题解决

    之所以搜索的关键字句会变成乱码的原因,主要是因为现在的搜索引擎都是使用UTF8,而Awstats是使用decodeUTFkeys这个plugin来处理搜索引擎的UTF8关键字,默认是没有打开的,所以在显示上会出现乱码。 要解决中文...

    python中urllib.unquote乱码的原因与解决方法

    Python中的urllib模块用来处理url相关的操作,unquote方法对应javascript中的urldecode方法,它对url进行解码,把类似”%xx”的字符替换成单个字符,例如:“法国红酒”解码后会转换成“法国红酒”,但是使用过程中...

    Mac Android Studio 3.0 Terminal 中文乱码问题处理

    前几天,收到 AS 发布的 3.0 更新,就迫不及待的更新了,更新后发现整个界面的画风都变了,和 IDEA 更像了 本人是命令行重度使用患者,平时都是使用 AS 下面的 Terminal,升级完成后,使用 git log 命令查看历史 log...

    使用 <fstream> 类进行文件的 I/O 处理

    传统的文件 I/O 库如 Unix 的 &lt;io.h&gt; 和 &lt;stdio.h&gt; ,由于其程序接口的原因,在很大程度上强制程序员进行某些处理,缺乏类型安全和国际化支持。C++ 的 &lt;fstream&gt; 库则在文件的 I/O 方面提供了一个增强的、面向对象的...

    php上传文件中文文件名乱码的解决方法

    可能会有不少朋友碰到一些问题就是上传文件时如果是英文倒好原文名不会有问题,如果是中文可能就会出现乱码了,今天我来给大家总结一下导致乱码php上传文件中文文件名乱码的原因与解决办法吧。 这几天在windows下...

    django项目运行因中文而乱码报错的几种情况解决

    django项目开发过程中,碰到了多种情况下的中文乱码报错,在这儿做一下处理总结。 报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position x-x: ordinal not in range(128) 1.因代码中的...

    【Web开发】彻底解决开发中请求(get/post)、应答以及控制台中文乱码问题

    我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。 思维导图: 1. 应答乱码处理(response输出页面时乱码) 1.1 ...

Global site tag (gtag.js) - Google Analytics