我的JSP中文编码解决方案
虽然以前就知道编码问题,但是一直没有遇到问题,以前用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中文编码解决方案的更多相关文章
- tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案
转:tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案 检查tomcat与web工程对应版本,tomcat中对应版本的jar包拷贝到web工程 ...
- Windows Azure 微软公有云体验(三) IIS中文编码解决方案
Windows Azure 微软公有云已经登陆中国有一段时间了,现在是处于试用阶段,Windows Azure的使用将会给管理信息系统的开发.运行.维护带来什么样的新体验呢? Windows Azur ...
- tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案【原创】
问题描述: tomcat启动后,console正常,console中语句为: 信息: Server startup in 7291 ms 但浏览器访问首页面http://localhost:808 ...
- Tomcat/JSP中文编码配置
来源:http://blog.csdn.net/zhangzikui/article/details/6169978 http://www.iteye.com/topic/300656 ...
- JSP中文编码问题
这个乱码问题是最简单的乱码问题.一般新会出现.就是页面编码不一致导致的乱码. <%@ page language="java" pageEncoding="UTF- ...
- Eclipse编辑jsp卡死解决方案
使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...
- Springboot 打jar包项目无法访问jsp问题解决方案
maven编译插件,请选择1.4.2.RELEASE版本,1.5.x的版本已经不再支持 pom.xml重要部分如下: <build> <resources> <resou ...
- (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全
JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...
- Tomcat与WAS应用中间件差异化分析研究
--转载 http://blog.chinaunix.net/uid-25723371-id-5759072.html 目前我们在使用的基于JAVA的提供逻辑展现应用中间件有两种,一种是以商用软件WA ...
随机推荐
- 次最短路径 POJ 3255 Roadblocks
http://poj.org/problem?id=3255 这道题还是有点难度 要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以 关键之处 次短的路径: 设u 到 v的边权重为cost ...
- Java jsp页面中jstl标签详解
JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...
- Linux内核设计与实现——读书笔记1:内核简介
内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...
- windows7 下安装使用memcached
Memcached 安装使用 本地环境:Windows7 64位web环境:wamp集成环境,php版本:PHP Version 7.1.17 学习参考网站: RUNOOB.COM官网 http:/ ...
- Hashtable和HashMap 的区别
Hashtable和HashMap 第一点不同 主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. 第二点不同 (也许 ...
- F - The Minimum Length
F - The Minimum Length HUST - 1010 #include<cstdio> #include<cstring> #include<iostre ...
- Spring @Value用法
Spring 通过注解获取*.porperties文件的内容,除了xml配置外,还可以通过@value方式来获取. 使用方式必须在当前类使用@Component,xml文件内配置的是通过pakage扫 ...
- c++之函数对象、bind函数
函数对象实质上是一个实现了operator()--括号操作符--的类. class Add { public: int operator()(int a, int b) { return a + b; ...
- 【APUE】wait与waitpid函数
当一个进程终止时,内核就向其父进程发送SIGCHLD信号.因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数.对 ...
- IntelliJ IDEA 基本配置入门
前言:今天下载安装IntelliJ IDEA.随手创建了一个项目,运行Build提示错误. 与大多数用于开发JAVA的IDE类似,不做不论什么配置.编译是不会成功的.因此我尝试对IDEA的配置进行了一 ...