JSP MySQL Tomcat Apache乱码解决一例

来源:互联网 发布:ar制作软件下载 编辑:程序博客网 时间:2024/06/05 16:57
<script type="text/javascript">google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//</script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>  本文以最常见的JSP MySQL Tomcat Apache乱码解决为例,望能为你的环境配置起到抛砖引玉之效!  乱码问题已历来已久,在开源环境下,乱码问题更是令程序员措手不及。本人在Unix(Freebsd)下的一次乱码经历可谓经典,故撰以此文以滋效尤!  我将本次所遇乱码归为三类:  1.页面字符乱码  2.记录显示乱码  3.request传递乱码  以下将对上述三类乱码进行解析:一.页面字符乱码:  1.大小写不一致:org.apache.jasper.JasperException: /top.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html;charset=gb2312, new: text/html;charset=GB2312)  2.间隔不一致:org.apache.jasper.JasperException: /top.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html; charset=GB2312, new: text/html;charset=GB2312)*解决方案:首先,在Apache中增加AddDefaultCharset GB2312或AddDefaultCharset GBK其次,统一使用页面编码定义,如:<%@page contentType="text/html;charset=GB2312"%>*注:GB2312为GBK之子集。二.记录显示乱码:  1.MySQL默人语言为latin1_swedish_ci,即拉丁语,所以取出的中文全是乱码。*解决方案:  1.将charset设为8859_1即:<%@page contentType="text/html;charset=8859_1"%>  这个方法只能暂时缓解字符显示问题,并权益之计。因为8859_1为字节型字库,并非字型字库,故在非全角状态下,将出现半字乱码,表现为“?”。  2.在数据库连接语句中加上?useUnicode=true;characterEncoding=GBK,如:jdbc:mysql://localhost/dbname?useUnicode=true;characterEncoding=GBK*注:一般教科书上都会加上localhost:3306,因为默认端口为3306,故可舍去!同时,请使用连接池的朋友注意,在注册xml文件时,是不可以单独出现“;”的,所以必须使用“&”,即:jdbc:mysql://localhost/dbname?useUnicode=true&characterEncoding=GBK。  否则提示出错:Parse Fatal Error at line 213 column 91: The reference to entity "characterEncoding" must end with the ';' delimiter.org.xml.sax.SAXParseException: The reference to entity "characterEncoding" mustend with the ';' delimiter.at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)  也曾有人提意:在MySQL的my.ini文件中加入default-character-set=gbk,本人不赞同此法,因为这样破坏了原有的环境,除非这是MySQL的第一个站点。三.request传递乱码:  1.也许,此时你已经可以正常使用系统了,那么恭喜~乱码问题已经离开你了!但是,大伙通常都没那么走运,乱码问题依旧存在。也许,这时你向数据库添加了一条记录以测试系统,可是此时显示出的还是乱码。那么可以肯定是Request参数传递出错!那么先写个测试语句:<%= request.getParameter(“Para”) %>,OK,果然是乱。那么,现在有两种解决方法。*解决方案:  1.加上这条语句:request.setCharacterEncoding("gbk");在一/两页上可行,但此法也非权益之计。  2.注册SetCharacterEncodingFilter类:  首先,编写SetCharacterEncodingFilter.java文件,代码如下:package cn.com.jsp;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 javax.servlet.UnavailableException;public class SetCharacterEncodingFilter implements Filter { protected String encoding = null; protected FilterConfig filterConfig = null; protected boolean ignore = true; public void destroy() { this.encoding = null; this.filterConfig = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Conditionally select and set the character encoding to be used if (ignore || (request.getCharacterEncoding() == null)) { String encoding = selectEncoding(request); if (encoding != null) { request.setCharacterEncoding(encoding); } } // Pass control on to the next filter chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); String value = filterConfig.getInitParameter("ignore"); if (value == null) { this.ignore = true; } else if (value.equalsIgnoreCase("true")) { this.ignore = true; } else if (value.equalsIgnoreCase("yes")) { this.ignore = true; } else { this.ignore = false; } } protected String selectEncoding(ServletRequest request) { return (this.encoding); }}  此文件为request过滤类,在全局编译前需进行注册。  注册文件为:<%wwwroot%>/WEB-INF/web.xml。  在此文件中加入如下代码即可: wwwroot MySQL Test App setCharacterEncodingFilter setCharacterEncodingFilter setCharacterEncodingFilter cn.com.jsp.SetCharacterEncodingFilter encoding GBK </init-param> </filter> setCharacterEncodingFilter /*</url-pattern> </filter-mapping>……</web-app>  OK,现在可以编译你的SetCharacterEncodingFilter.java文件啦!  至此,乱码将与你格格不入!
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 切换过滤器 自动过滤器价格 y形过滤器 过滤器怎么做 粗过滤器 除菌过滤器 花生油过滤机 前置过滤器品牌 膜过滤器 广告过滤器 红酒过滤器 工业水过滤器 java过滤器 双联过滤器 一次性过滤器 塑料过滤器 无阀过滤器 果汁过滤机 调压过滤器 圆盘过滤机 酒过滤器 汽车过滤器 果汁过滤器 过滤器的作用 过滤器怎么安装 燃油过滤器 前过滤器 耐腐蚀过滤器 饮水过滤机 在线过滤器 棉饼过滤机 简易过滤器 制作过滤器 空气过滤器品牌 进气过滤器 管道过滤器价格 过滤器滤芯厂家 正压过滤器 蒸汽过滤器 油品过滤器 过滤器公司