虽然以前就知道编码问题,但是一直没有遇到问题,以前用asp.net和php的时候,感觉很自然地写程序,没怎么特别处理编码问题,这回改用java写,真心被恶心到了。

  进行了一番查阅学习后,终于搞明白了一些东西。

  中文乱码出现的原因,是因为tomcat和jsp的默认编码是ISO-8859-1,不支持中文,支持中文的常用的有三种编码,gb2312,gbk,utf-8,所以需要指定用这三种中的一种。web程序总分为请求和响应,这个过程中的内容就是先被编码然后再解码,如果不一致的话,就会导致出现中文乱码的问题。

  首先我要说下我的编码选择,再查阅了大量有关gb2312,gbk,utf-8的资料后,我还是选择了utf-8,以下是我的理由,全是网上查到的资料,如有误,还望指出:

  1、gbk是gb2312的扩展,完全包含gb2312,gbk包含所有汉字字符的编码。而且eclipse里的字符编码居然默认是gbk,windows平台(7和以前的,不知道win8是什么情况)默认也是gbk,虽然gbk不是国家标准,但是国内用得最广的中文字符编码方式。所以这两者中选一个,毫无疑问,选择gbk。

  2、utf-8和gbk编码机制不一样,gbk不管英文中文全部用两个字符进行编码,utf-8则是对于英文字符用一个字符,对非英文字符用三个字符。看到网上一堆人讨论导致的页面大小问题,看多了给我的感觉是没啥区别,如果全是英文毫无疑问使用utf-8的页面会很小,国内的中文网站其实一个页面里的大部分也是html代码,很少有中文远远多于英文字符的,除非那种页面特别长的阅读类网站,不过大部分也有翻页机制吧,所以大小问题不怎么重要。

  3、gbk是国内一种机制,utf-8是国际标准。就是说试用utf-8编写的网站,外国人用浏览器无需下载解码包就能正确显示内容,用gbk的不使用解码包则显示乱码。

  4、linux默认支持utf-8,而不支持gbk,需要额外工作才能让其支持gbk。

  5、utf-8是国际标准,也是未来的主流,使用utf-8可以省很多事,大部分企业内部也是使用utf-8编码。sina、baidu等大公司大部分gbk的站点是历史原因,新项目都是用utf-8。(看到的资料)

  6、据说gbk很容易导致jquery等js框架出现乱码问题,而utf-8不会。

  好了,也不多说了,根据这几点我还是选择了utf-8,不过网上有大牛说有大公司还有选择gb2312的,因为那个访问中文网站速度更快,我有点相信这个的,因为utf-8是国际编码机制,gbk是特定针对中文的,一般来说通用性好的效率会差点。不过也就百度 sina这种超大型的站点才需要考虑这些技术细节,对于普通站点,为了少遇到问题,还是选择utf-8为好。

  再说说乱码问题,乱码一般是在对参数编码解码时产生的。web中的传参方法就是两种,post方法或者get方法。

  首先我们要设置好页面编码。jsp页面有三个地方可以设置编码方式。

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>中文编码问题</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
</head>
<body>
中文编码问题
</body>
</html>

  pageEncoding是jsp文件的存储格式,Eclipse会根据这个编码格式保存文件,并编译jsp文件,包括里面的汉字。contentType是解码格式,存成utf-8的文件用iso8859-1解码,肯定会出现乱码。一般来说第二行是不写的,设置了pageEncoding后,contentType就一样了,如果需要单独设置,则需都写出来。都不写,就都是默认的iso8859-1。第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编码格式没有关系。有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面,导致浏览器混淆了编码格式,出现了乱码。

  使用get传参出现的乱码问题解决:

  1、String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8")  这属于直接转码,都这么写有点麻烦,不推荐

  2、修改tomcat等web容器的配置,设置好了之后可以不用管get传参的问题了,推荐使用。Get走的是url提交,而在进入url之前已经进行了iso8859-1的编码处理。要想影响这个编码则需要在server.xml的Connector节点增加useBodyEncodingForURI="true"属性配置,即可控制tomcat对get方式的汉字编码方式,上面这个属性控制get提交也是用request.setCharacterEncoding("UTF-8")所设置的编码格式进行编码。所以自动编码为utf-8,接受页面正常接受就可以了。

<Connector port="8099" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8"
/>
<Connector port="8000" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8"
/>

  使用post传参出现乱码问题解决:

  1、同上面第一种方法

  2、使用request.getParameter取参数之前先设置编码格式request.setCharacterEncoding("utf-8"),指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。而且,该指定只对POST方法有效,对GET方法无效!!!。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。

  3、为了避免每页都要写request.setCharacterEncoding("UTF-8"),建议使用过滤器对所有jsp进行编码处理。这个网上有很多例子。请大家自己查阅。

  Java代码关于url请求,接受参数的乱码:

  url的编码格式,取决于上面所说的URIEncoding=”UTF-8”。如果设定了这个编码格式,则意味着所有到url的汉字参数,都必须进行编码才可以。否则得到的汉字参数值都是乱码,例如一个链接:response.sendDerect("/a.jsp?school=北科大");而在a.jsp里面直接使用 String school= request.getParameter("school");得到的就是乱码。因为规定了必须是utf-8才可以,所以,这个转向应该这样写:

response.sendRedirect("a.jsp?school="+java.net.URLEncoder.encode("北科大","utf-8"));

我的JSP中文编码解决方案的更多相关文章

  1. tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案

    转:tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案 检查tomcat与web工程对应版本,tomcat中对应版本的jar包拷贝到web工程 ...

  2. Windows Azure 微软公有云体验(三) IIS中文编码解决方案

    Windows Azure 微软公有云已经登陆中国有一段时间了,现在是处于试用阶段,Windows Azure的使用将会给管理信息系统的开发.运行.维护带来什么样的新体验呢? Windows Azur ...

  3. tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案【原创】

    问题描述: tomcat启动后,console正常,console中语句为: 信息: Server startup in 7291 ms   但浏览器访问首页面http://localhost:808 ...

  4. Tomcat/JSP中文编码配置

    来源:http://blog.csdn.net/zhangzikui/article/details/6169978         http://www.iteye.com/topic/300656 ...

  5. JSP中文编码问题

    这个乱码问题是最简单的乱码问题.一般新会出现.就是页面编码不一致导致的乱码. <%@ page language="java" pageEncoding="UTF- ...

  6. Eclipse编辑jsp卡死解决方案

    使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...

  7. Springboot 打jar包项目无法访问jsp问题解决方案

    maven编译插件,请选择1.4.2.RELEASE版本,1.5.x的版本已经不再支持 pom.xml重要部分如下: <build> <resources> <resou ...

  8. (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全

    JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...

  9. Tomcat与WAS应用中间件差异化分析研究

    --转载 http://blog.chinaunix.net/uid-25723371-id-5759072.html 目前我们在使用的基于JAVA的提供逻辑展现应用中间件有两种,一种是以商用软件WA ...

随机推荐

  1. [NOIP2003] 提高组 洛谷P1038 神经网络

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  2. [NOIP1998] 普及组

    三连击 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数. 输入输出格式 输入格式: 木有输入 输出格式: 若干行, ...

  3. linux service命令解析(重要)

    我们平时都会用service xxx start来启动某个进程,那么它背后究竟执行了什么? 其实service的绝对路径为/sbin/service ,打开这个文件cat /sbin/service, ...

  4. hdu 4049 Tourism Planning [ 状压dp ]

    传送门 Tourism Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. MySQL查询count(*)、count(1)、count(field)的区别收集

    经过查询研究得出这个和MySQL中用什么引擎有关,比如InnoDB和MyISAM在处理这count(*).count(1).count(field)都有不同的方式,还有就是和版本都有关系,不同的版本会 ...

  6. 碧砚适合佳能328 4452 ICD520 4472 4450 硒鼓4700一体机墨盒4770

  7. 常见machine learning模型实现

    一.感知机模型 二.线性回归(Linear Regression) from numpy import * def loadData(filename): x = [] y = [] f = open ...

  8. hdu 4599 Dice

    数学能力已经彻底降低到了小学水平,真是惨啊惨... 首先G(M)很容易确定,G(M) = 6 * M; H(N) = 6 * F(N),于是推出来H(N)就可以了,昨天请教了一下别人,直接数学公式搞定 ...

  9. 从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志

    这一章节我们引入简单的AOP日志实现. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03.topic_1_1; pub ...

  10. 聚合类新闻client产品功能点详情分析

    产品功能点 功能 今日头条 百度新闻 鲜果 ZAKER 媒体订阅 × √ ★ ★ 个性化内容推荐 ★ √ × × 个性化订阅(RSS) × × ★ × 视频新闻 × × × × 评论盖楼 √ √ √ ...