热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

木其工作室代写程序[原]javaweb项目各种乱码的解决方案

淘宝网上专业IT程序代写原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本人声明。否则将追究法律责任。作者:永恒の_☆地址:http:
淘宝网上专业IT程序代写
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。
作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/10299103

一、前言

    目前web项目中,很多乱码情况没有得到统一解决,或多或少影响开发效率和延长开发时间, 所以总结一下关于java web项目各种乱码情况的解决方案。


二、准备条件

     1、一个普通的web项目 webProject;

     2、一个web服务器 Tomcat。


三、分析各种乱码的情况

     1、项目的编码格式和页面文件的编码格式不一样是否有冲突?

      答:webProject项目的编码格式是“GBK” ,项目下的页面中的编码格式是“UTF-8”,实践发现,项目的编码格式和页面的编码格式不一样不会有任何问题,显示的中文没有乱码。    

     查看项目的编码格式可以在 项目-->右键-->Properties--> Text file encoding 框内显示的具体值就是项目编码格式。 

     查看页面文件的编码格式可以在 页面-->右键-->Properties--> Text file encoding 框内显示的具体值就是页面文件的编码格式。


     2、页面的文件编码格式和页面内容的编码格式不一样是否有冲突?

      答:<1>将页面文件编码格式改为“UTF-8”,页面的内容的编码格式改为“GBK”,具体如下:

<%@ page language="java" cOntentType="text/html; charset=GBK" pageEncoding="GBK"%>







测试中文是否乱码!@#!@#

结果发现 乱码了,具体效果如下:


所以页面的文件的编码格式必须和页面内容的编码格式一样,否则显示肯定乱码。

     <2>另外,如果页面中格式在eclipse显示 是好的,这个时候改变文件的编码格式也会乱码,如果非要改变文件编码的格式,可以这样: 先将显示正确的内容复制一份 然后修改文件的编码格式,这个时候文件内显示的是乱码,然后将复制的内容直接覆盖在这个页面中就好了。


     <3>如果给将上面代码的pageEncoding改为"UTF-8"了发现显示正常了,所以可不可以这么说,页面显示是否乱码与charset指定的值无关?


     <4>但是如果将上面代码的pageEncoding="UTF-8“这个属性直接去掉,然后显示效果,发现乱码了。 如果把contentType属性的值改为 cOntentType="text/html; charset=UTF-8" 试试效果,具体如下:


所以可以这么理解:在没有指定pageEncoding属性的时候, charset 将会被忽略,如果没有指定pageEncoding属性,那么页面就会按照charset的编码值来显示具体效果。


     <5>如果charset指定的值是GBK ,这个时候由于没有pageEncoding 所以页面内容按照GBk编码显示,但是与文件编码格式不符合 ,索引导致乱码。具体效果如下:

     <6>现在又有另外一种情况,如果pageEncoding指定了UTF-8 ,但是charset指定的是 GBK ,GB2312  这个时候页面显示不会乱码。


     <7>但是如果charset指定的是iso-8859-1,这个时候页面显示就是乱码了,具体效果如下:


     <8>但是如果charset指定的是big5,这个是页面显示只是部分乱码,具体效果如下:

所以BIG5只会会繁体或者没有繁体格式的文字敏感。


     <9>现在再实验一下,把contentType属相也去掉,指定meta标签中content属性中的charset=UTF-8 ,具体效果如下:

一种另外格式的乱码显示出来了。。。


综上所述:在jsp中如果要显示正确的内容,并且保证其显示不乱码,必须要指定contentType 或者 pageEncoding 的属性与文件编码格式一致。并且如果他们都存在,那么pageEncoding必须与文件编码格式一致,contentType必须是中文编码格式才行。


    3、通过URL传递中文参数的时候接收的乱码怎么解决?

     答:<1>新建一个servlet 名叫encodeServlet,在encode.jsp中添加超链接传递一个参数  跳转到该serlvet。

超链接如下:

go to servlet

servlet接收参数,具体get方法处理方式如下:

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String param = request.getParameter("param");
        
        request.getRequestDispatcher("../encode.jsp?param="+param).forward(request, response);
    }
调试之后发现,参数乱码了:


     <2>这是因为参数通过url传递的时候是以http超文本协议传递的,它的格式是 iso-8859-1 ,所以可以设置tomcat服务器全局URL请求的格式,这样子所有的请求都会按照这个编码格式传递参数了。具体如下:

在tomcat安装目录的conf/server.xml中找到protocol="HTTP/1.1"的属性配置的连接器,在里面添加URIEncoding属性,具体如下:

URIEncoding="UTF-8" cOnnectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

URIEncoding ,顾名思义,它只针对 URL传递的请求,即get请求。。


     <3>并且如果这么设置之后就不能再使用 param = new String(param.getBytes("iso-8859-1"),"UTF-8");转码了  这样反而又变乱码了。


     <4>另外还可以在接收到参数之后,重新指定编码也可以,具体如下:

		String param = request.getParameter("param");
		param = new String(param.getBytes("iso-8859-1"),"UTF-8");

调试页面,发现并没有成功,具体效果如下:

没有效果,,,为什么,?因为页面的内容编码是UTF-8的,但是URL它传递的时候只能传递iso-8859-1 的编码,如果直接传递UTF-8编码的内容,那么无论后台怎么转换都没有效果。 即使在servlet中重新指定charset 也无济于事。


     <5>但是如果直接在地址栏输入: http://localhost:8080/webProject/servlet/encodeServlet?param=中文

并且修改一些代码,具体修改如下:

        response.setContentType("text/html;charset=UTF-8");
        String param = request.getParameter("param");
        param = new String(param.getBytes("iso-8859-1"),"UTF-8");

然后运行效果如下:


这样子是没问题的。。


     <6>但是如果非要使用new String()重新编码来实现接收中文怎么办呢?,可以修改源码,具体如下:

		request.setCharacterEncoding("UTF-8");
		String param = request.getParameter("param");
		param = new String(param.getBytes("iso-8859-1"),"UTF-8");
		
设置字符编码格式 即可,具体效果如下:



实践证明,不管是超链接 跳转到servlet 还是直接在url输入中文跳转到servlet 只使用request.setCharacterEncoding("UTF-8"); 统一编码格式 都可以实现接收正确的参数。。

最开始一直以为request.setCharacterEncoding("UTF-8"); 只能处理post请求的参数,get请求的一样可以。


     <7>既然这么有效果,那么为了避免重复的使用这行代码或者忘记使用而导致乱码,可以使用一个过滤器 统一处理任何请求的编码格式。一劳永逸。

具体FIlter代码如下:

package com.struts2.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.log4j.Logger;

public class CharacterFilter implements Filter {

	private Logger logger = Logger.getLogger(this.getClass());
	String encoding = null;
	@Override
	public void destroy() {
		logger.info("***************the CharacterFilter class' destroy() is invoking .***************");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterChain) throws IOException, ServletException {
		request.setCharacterEncoding(encoding);
		response.setCharacterEncoding(encoding);
		filterChain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		logger.info("***************the CharacterFilter class' init() is invoking .***************");
		encoding = filterConfig.getInitParameter("encoding");
	}

}

然后web.xml的配置如下:

  
    characterFitler
    com.struts2.util.CharacterFilter
    
      encoding
      UTF-8
    
  
  
    characterFitler
    /*
  

     <8>但是但是,实际开发中,上面的配置在处理get请求的时候 有些时候可以指定编码成功,有的时候指定编码失败, 成功率大概60-70%之间,至今不知道为何会这样。。。

解决方案:

使用js函数编码之后,然后后台解码即可,具体前台代码如下:

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






测试中文是否乱码!@#!@#
go to servlet
后台解码代码如下:

		//request.setCharacterEncoding("UTF-8");
		//response.setContentType("text/html;charset=UTF-8");
		String param = request.getParameter("param");
		//param = new String(param.getBytes("iso-8859-1"),"UTF-8");//这个用于直接处理转换get请求的编码
		//param = URLEncoder.encode(param);//这个是用于编码的方法
		param = URLDecoder.decode(param);//这个是用于解码的方法

ok ,这样子解决了js函数请求后台出现乱码的情况。


     <9>另外在利用PrintWriter输出的时候 出现乱码了,具体代码如下:

		PrintWriter out = response.getWriter();
		out.print("接收的参数是:"+param);
		
		out.close();
具体效果如下所示:


这里可以在servlet请求的顶部加上response.setContentType("text/html;charset=UTF-8"); 设置内容编码格式 即可输出正确的效果,具体如下图:


综上所述:

(1)在参数的时候出现乱码,如果是get请求可以统一设置tomcat的uri编码处理格式,这样所有的url发送的请求都是以指定格式发送。

(2)request.setCharacterEncoding("UTF-8");主要用户 get/post请求中设置整个servlet的编码格式,好处是防止传递的中文参数乱码。

(3)response.setContentType("text/html;charset=UTF-8"); 主要用于指定当前请求中的内容格式,好处是防止输出内容的时候防止中文乱码。

(4)如果在处理中文乱码中以上方法都解决不了,那就要使用js前段编码两次,后台解码的方式处理。


    4、是否有其他框架的配置直接解决中文乱码情况?

     <1>如果项目中使用了struts2 ,可以在sturts.xml中配置一个常量,指定所有post请求的编码,具体如下:

	


     <2>如果在项目中使用了spring,可以在web.xml中配置一个过滤器也可以解决编码乱码的问题,具体如下:

  
    encodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    
    
      forceEncoding
      true
    
  
  
    encodingFilter
    /*
  








     


作者:ch656409110 发表于2013-8-25 17:03:06 原文链接
阅读:1720 评论:7 查看评论

推荐阅读
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 如何构建基于Spring MVC框架的Java Web应用项目
    在构建基于Spring MVC框架的Java Web应用项目时,首先应创建一个新的动态Web项目。接着,需将必要的JAR包导入至WebContent/WEB-INF/lib目录下,确保包括Spring核心库及相关依赖。如遇缺失的JAR包,可向社区求助或通过Maven等工具自动下载。正确配置后,即可开始搭建应用结构与功能模块。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 深入解读代码页与字符集的概念及其实际应用
    许多开发者可能未曾留意到这一问题,但如果您的网站频繁遭遇不明原因的乱码现象,深入了解代码页与字符集的概念及其实际应用将大有裨益。代码页(Codepage),即内码表,是计算机系统中用于映射字符与其编码值的一种机制,不同的代码页支持不同的字符集,正确选择和配置代码页对于确保文本数据的准确显示至关重要。在多语言环境下,合理运用字符集和代码页能够有效避免字符编码冲突,提升用户体验。 ... [详细]
  • SpringBoot启动脚本详解:BAT文件应用与基础入门指南(SpringBoot系列第1篇)
    如果你还在为SSM框架的复杂搭建过程和繁琐的配置文件而烦恼,那么SpringBoot将是你的一大福音。作为SpringBoot系列的第一篇文章,本文详细介绍了如何使用BAT文件来启动SpringBoot应用,并提供了基础入门指南,帮助开发者快速上手,简化开发流程。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 解决MySQL 5.1服务器无法正确识别中文字符的问题
    在使用MySQL 5.1服务器时,可能会遇到无法正确识别中文字符的问题。由于相关资料较少且不够全面,本文将详细阐述解决方案。首先,需要检查MySQL的配置文件,确保字符集设置正确,并通过命令行工具验证当前的字符编码配置。此外,建议更新到最新版本以避免此类问题。 ... [详细]
  • 解决手机浏览器无法加载CSS文件的技术方法与常见问题分析
    针对手机浏览器无法加载CSS文件的问题,本文提出了几种有效的解决方案:首先,确保CSS文件路径正确无误;其次,统一CSS文件和网页的编码格式;最后,检查并修正文件后缀的MIME类型设置,以确保浏览器能够正确识别和解析CSS文件。此外,还探讨了可能导致该问题的其他常见原因,如缓存问题和服务器配置错误等。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
author-avatar
mobiledu2502857823
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有