在JavaWeb应用开发中,经常会出现页面中本该显示中文的地方却是乱码的情况。究其原因,主要是由于在Web组件之间、或Web组件与浏览器、与数据库所使用的字符集标准不统一,Web应用程序运行过程中,中文字符往往需要在不同的字符集之间来回转换,这就导致了中文乱码问题的频繁出现。本文从Web应用的常用编码出发,详细讨论JavaWeb应用开发中出现中文乱码的原因以及解决办法。本文讨论的环境是基于JDK5.0,服务器为Tomcat5.5,数据库为MySQL5.0。
1  Web应用的常用编码
    Web应用中常用的编码主要有ISO8859-1,GB2312,GBK,Unicode和UTF-8。
1.1 ISO8859-1
    ISO8859-1,是国际标准化组织内ISO/IEC8859的第一个8位字符集,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。

1.2 GB2312/GBK
    GB2312和GBK是中华人民共和国国家标准汉字信息交换用编码,简称国标码,专门用来表示汉字,是双字节编码。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字。
1.3  
    UnicodeUnicode(统一的字符编码标准集)使用2个字节对每一个字符进行编码,是Java语言默认的字符集。
1.4UTF-8
    UTF-8编码,用1到6个字节编码Unicode字符,用在网页上可以在同一页面显示中文简体繁体及其他语言。
2  Web应用中的中文乱码问题的分析
    在Web应用中,通常包括了浏览器、Web服务器、Web应用程序和数据库等部分,每一部分都有可能使用不同的字符集,从而导致字符数据在各种不同的字符集之间转换时出现乱码问题。
    在弄清Web应用中的中文乱码问题前,先明确理解JavaWeb开发中所用到的JSP/Servlet应用程序中的几个有关编码设置的方法。
    在JSP/Servlet中主要有以下几种方式可以设置编码("***"表示编码方式):

1)  pageEncoding="***"的作用是设置JSP编译成Servlet时使用的编码。
 
2)  contentType="text/html;charset=***"的作用是指定对服务器响应进行重新编码的编码。
 
3)  request.setCharacterEncoding("***")的作用是设置对客户端请求进行重新编码的编码(仅仅只适用于设置 post提交的requestbody的编码而不是设置 get方法提交的queryString 的编码。该方法告诉应用服务器应该采用什么编码解析 post传过来的内容。)。
 
4)  response.setCharacterEncoding("***")的作用是指定服务器响应客户端请求时进行重新编码的编码。JSP文件的运行过程如图1所示。
 
    当JSP引擎把JSP文件按pageEncoding所指定的编码方法编码转换为Servlet文件时,若pageEncoding没有指定,则按照contentType所指定方法编码。若二者都没有指定,则将按照JVM的默认编码方法进行编码。若这一步骤编码不支持中文,则JSP文件中的中文转化为Servlet文件时本身就是乱码。
    客户端浏览器在发送和接收数据时,按照JSP文件的contentType所指定的编码方式来对URL和参数编码。服务器在接收数据时,按照request.setCharacterEncoding的设置对数据进行编码,在发送数据时,按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序对要发送的数据进行URL编码。在这个过程中,如果参数中包含中文,而没有设置好编码方式,服务器在处理数据的过程中就会出现中文乱码问题。
 
3  JavaWeb开发中文乱码问题的解决方法
3.1  页面显示乱码
    如果在访问某个JSP页面或者Servlet产生的页面时,页面上本应显示中文信息的地方,却显示为乱码,这可能是浏览器显示不正确,也可能是后台在动态生成界面的时候,其内容就是乱码。
    如果是浏览器显示的问题,需要设置JSP或者Servlet的contentType属性。对于JSP中的设置使用的是page指令,设置如下:<%@page contentType=”text/html”;charset=”GB2312”>,对于Servlet生成的页面,可以在输出页面之前调用response的setContentType()方法,其代码形式如下:response.setContentType(“text/html;charset=GB2312”)另外,在生成的HTML文件的头部可以加入如下代码:<meta http-equiv=“contenttype”content=“text/html;charset=GB2312”>以减少中文乱码的发生。
 
3.2  用户提交的数据是乱码
    当表单中提交的中文数据出现乱码时,原因是request对浏览器提交的数据解码不正确。根据表单提交方式的不同,此类乱码问题有两种解决方法。
    对于表单中POST方式提交的数据,数据是作为请求的消息体发送的,默认情况下采用ISO8859-1编码,所以要设置请求对象的字符编码,代码形式如下:
request.setCharacterEncoding("GB2312"),在响应页面上使用response.setCharacterEncoding("GB2312")设置编码方式。如果需要处理的页面过多时,单个处理就会比较麻烦,这时可以通过设置过滤器将所有的request编码都进行设置。
    对于表单中GET方式提交的数据或者URL提交的数据,只在接收数据的JSP文件或Servlet文件中设置request.setCharacterEn⁃coding参数是不行的,因为在Tomcat5.0中,默认情况下使用ISO8859-1对URL提交的数据和表单中GET方式提交的数据进行编码。因此,在这种情况下,需要修改Tomcat的server.xml文件。具体方法如下:
在Tomcat的server.xml文件中,在port号为8080的Connector元素中增加一个属性:URIEncoding="GB2312"。
 
 
Java中网络传输使用的标准字符集是ISO-8859-1,所以在后台用request.getParameter("message");获取前台传过来的中文时,得到的还是ISO-8859-1字符集,中文就会出现乱码现象,好多人的解决办法是在前台传递中文之前进行decode,后台再decode一下进行转换,这样感觉很是麻烦
 
处理方法一:

js 程序代码:url=encodeURI(url);注意是整个URL 
服务器端的代码:String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

处理方法二:
js:var url="name="+name; 
url=encodeURI(encodeURI(url)); //用了2次encodeURI 
window.location = "<%=path%>/inner/line/line.jsp?"+url; 
服务器端的代码: 
String linename = request.getParameter(name); 
//java : 字符解码 
linename = java.net.URLDecoder.decode(linename , "UTF-8");
 
 
 
参考案例:http://www.cnblogs.com/o-andy-o/archive/2013/03/04/2942976.html

java中文乱码分析整理的更多相关文章

  1. java中文乱码解决之道(一)-----认识字符集

    沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...

  2. java中文乱码解决之道(九)-----总结

    乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...

  3. 关于Java中文乱码与日期格式

    关于Java中文乱码与日期格式 Java中文乱码的问题其实很普遍了,首先,一般不会在Windows平台下面出现,同时,一般在Tomcat应用服务器下也都正常,但是到了WebSphere,Weblogi ...

  4. java中文乱码解决之道(一)—–认识字符集

    原文出处:http://cmsblogs.com/?p=1395 沉寂了许久(大概有三个多月了吧),LZ“按捺不住”开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要 ...

  5. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  6. java中文乱码解决之道(七)-----JSP页面编码过程

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...

  7. java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**

    原文出处:http://cmsblogs.com/?p=1412 在上篇博文(java中文乱码解决之道(一)—–认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述 ...

  8. Java中文乱码解决方案

    Java中文乱码解决方案   1.中文乱码解决方案,确保每个文件的默认编码是UTF-8         加入 URIEncoding="UTF-8" 代码中的设置 1>在se ...

  9. java中文乱码解决之道(七)—–JSP页面编码过程

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...

随机推荐

  1. VS 自动添加注释

    现在大多数公司都规定程序员在程序文件的头部加上版权信息,这样每个人写的文件都可以区分开来,如果某个文件出现问题就可以快速的找到文件的创建人,用最短的时间来解决问题,常常是以下格式: //======= ...

  2. 纯js开发防win7日历控件

    不久前项目开发中遇到需要用js实现选择日期的需求,百度了下,确实一大把一大把的,但多少还是有些不符合当前需求,遂down了一份最接近的,然后修修改改,基本符合了... 先上几张效果图~~~ 需要输入时 ...

  3. nginx 高并发配置参数(转载)

    声明:原文章来自http://blog.csdn.net/oonets334/article/details/7528558.如需知道更详细内容请访问. 一.一般来说nginx 配置文件中对优化比较有 ...

  4. RHEL6 --部署phpMyAdmin与论坛系统

    一.rpm安装LAMP平台部署phpMyAdmin 二.搭建wordpress个人博客系统 三.搭建论坛系统 一.rpm安装LAMP平台及部署phpMyAdmin 1.phpMyAdmin简介及获取方 ...

  5. SSZIPArchive的相关用法截图

  6. C语言程序设计第4堂作业

    大家注意:本次作业稍有增加,由于放假期间大家空闲时间比较充足,将之前学习过程中遗留的问题必须在假期解决.   本次课学习主要内容: 分支结构中的二分支结构.多分支结构和else-if语句 掌握字符型数 ...

  7. 如何解决Selenium中"Cannot find function addEventListener in object [object HTMLDocument]"的错误

    project: blog target: how-to-resolve-cannot-find-function-addEventListener-error-in-selenium.md stat ...

  8. 《Linux内核分析》实验一

    陈智威,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课堂学习笔记: 作业截图: 汇编代码堆栈分析: ...

  9. HTML 样式属性

    @charset "utf-8"; /* CSS Document */ <style> p{ /*背景与前景*/ background-color:#000;/*背景 ...

  10. js-innerHTML

    innerHTML的使用: 首先看一下这个单词的表面意思:inner是内部.内部的:HTML相信大家都懂. 那么,innerHTML的意思就是设置xxxx的内部内容,并且识别HTML的标签.用法格式: ...