`

乱码的原因和处理

 
阅读更多

                                               乱码的原因和处理

 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");
	}
	
}
 

 

 

 

 

 

分享到:
评论

相关推荐

    乱码解决 乱码解决 乱码解决 乱码解决 乱码解决

    4. **使用有良好编码支持的工具**:选择那些能够识别和处理多种编码的工具,以减少乱码的出现。 5. **备份与版本控制**:定期备份文件,并使用版本控制系统,如Git,以防止因操作失误导致的乱码问题。 乱码问题...

    jacob乱码原因解释

    总结,"jacob乱码原因解释"涉及到的关键知识点包括:文件编码理解,Java I/O操作,Jacob API的正确使用,Office文档元数据处理,字符集兼容性,以及潜在的兼容性问题。理解和解决这些问题对于顺利进行Office到HTML的...

    提交数据到服务器中文乱码处理

    通过以上步骤和示例代码,我们可以有效地处理提交数据到服务器时的中文乱码问题。在实际开发中,理解并正确应用字符编码是非常重要的,它可以避免许多不必要的错误和混淆,提升软件的稳定性和用户体验。

    中文乱码处理问题总结

    ### 中文乱码处理问题总结 #### 一、引言 在进行中文字符处理时,经常会出现乱码问题。这主要是因为不同的系统、程序或组件可能采用不同的编码方式,而这些编码方式之间的转换不当就会导致乱码现象。本文将重点...

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

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

    WEBSPHERE乱码问题的解决和处理

    本文将详细探讨WEBSPHERE中出现中文乱码的具体原因以及相应的解决方案。 #### 一、问题背景与分析 根据提供的信息来看,用户在部署了一个WebSphere集群后,发现通过WebService接口传递的数据中,所有的中文字符都...

    数据库乱码的处理

    本文将详细介绍如何识别和处理数据库中的乱码问题,并通过一个具体的Java示例来展示如何使用正则表达式来解决部分乱码的问题。 #### 二、乱码的原因分析 乱码通常是由字符编码不匹配导致的。当系统在存储或读取...

    程序中关于乱码的处理

    处理乱码的关键在于理解不同编码间的转换规则,并在每个可能出现乱码的环节进行适当地设置和转换。这包括文件编码、数据库编码、HTTP请求和响应的编码、以及在内存中处理字符串时的编码。只有对整个数据流的编码保持...

    润乾报表乱码问题

    在信息技术领域,乱码问题是指字符在计算机中由于编码不一致或者不正确而导致的显示错误,通常表现为无法识别...需要系统地检查各个环节,确保整个数据处理和传输过程中的编码设置都正确无误,才能有效地解决乱码问题。

    解压文件时中文乱码问题处理

    首先,我们需要了解乱码产生的原因。中文乱码通常是因为字符编码不一致导致的。当压缩文件创建时采用了一种字符编码(如GBK),而在解压时系统或应用使用的却是另一种编码(如UTF-8),就会出现乱码现象。7-Zip虽然...

    处理pdfmarker中文乱码及内存溢出的处理

    综上所述,处理PDFMaker中的中文乱码问题主要涉及设置正确的字符编码,而内存溢出则需要通过优化代码、限制内存使用和使用适当的工具进行调试。在使用PDFMaker或其他类似工具时,理解并应用这些技巧将有助于提高代码...

    hadoop中文乱码问题

    本篇将深入探讨Hadoop中文乱码问题的原因及解决方案。 首先,我们需要理解Hadoop系统中的编码设置。Hadoop默认使用的是UTF-8编码,但并非所有系统或文件都遵循这一标准。当输入的中文数据使用了不同的编码格式,...

    jsp页面乱码处理

    #### JSP乱码的根本原因 JSP页面的乱码通常源自字符编码不一致,即不同环节使用的编码格式不匹配。例如,Java后端使用的是Unicode编码,而前端浏览器使用的是GBK(GB2312扩展);MySQL数据库默认使用的是UTF-8。...

    火炬之光乱码处理方法

    火炬之光是一款备受欢迎的动作角色扮演游戏,然而许多...当然,在实际操作过程中还需要注意备份和个人技术水平等因素,以免造成不必要的麻烦。希望本文能够帮助到遇到类似问题的玩家们,让你们能够顺利享受游戏的乐趣。

    阿里云缺失字体文件导致乱码问题处理

    1. **识别乱码原因**:首先,确定乱码是由哪种字体缺失引起的。这可以通过查看图片或文本源代码中的字体引用来确定,或者通过运行诊断工具进行分析。 2. **获取缺失字体**:找到引起问题的字体文件,如本案例中的...

    MySQl处理乱码

    本文将深入探讨MySQL处理乱码的相关知识点,包括字符集的概念、乱码产生的原因、解决方法以及如何避免乱码问题。 一、字符集与乱码 1. 字符集(Character Set):字符集是一系列符号和编码的集合,如ASCII、GBK、...

    php mysql excel 乱码终极处理

    #### 一、乱码产生的根本原因 在进行PHP开发过程中,尤其是在处理Excel文件并将其数据导入MySQL数据库时,经常会遇到乱码问题。这主要是由于不同环节间的字符编码不统一所导致的。具体来说,可以从以下几个方面来...

    jsp 中文乱码 原因及彻底解决办法

    【JSP 中文乱码的原因及解决方法】 在开发基于Java的JSP应用程序时,遇到中文乱码问题是很常见的困扰。这是因为Java的核心和class文件基于Unicode编码,这为跨平台提供了便利,但也引入了处理中文字符时可能出现的...

    JSP中文乱码的产生原因及解决方案

    在JSP开发中,中文乱码是一个常见的问题,它源于Java和JSP处理中文字符的方式。Java语言核心和class文件基于Unicode,确保了程序的跨平台性,但也为中文乱码问题埋下了伏笔。主要的乱码问题分为两类:一是Java和JSP...

    韩文乱码转换器

    1. **编码检测**:软件能自动检测或让用户选择文件的原始编码格式,这对于准确识别乱码的原因至关重要。 2. **编码转换**:支持将文本从一种编码格式转换到另一种,比如从EUC-KR转为UTF-8,以确保文本在各种环境下...

Global site tag (gtag.js) - Google Analytics