虽然以前就知道编码问题,但是一直没有遇到问题,以前用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. [NOIP2002] 提高组 洛谷P1034 矩形覆盖

    题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...

  2. 解决Flex4在Module里调用PopUpManager报错问题

    项目大了 就需要用到Module, 发现在一个Module里边, 和普通应用里一样popup一个组件的时候, 总是会报错. 这个在Flex3的时候也会出现, 会报样式错误 所以就想到了addPopUp ...

  3. python学习之-- redis模块操作 集合和有序集合

    redis 模块操作之 集合set和有序集合zset Set 集合操作,不允许重复的列表sadd(name,value):name对应的集合中添加元素scard(name):获取name对应的集合中元 ...

  4. java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。

    import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; //请在小于99999的正整数中找符合下列条件的 ...

  5. SpringBoot初始教程之日志处理(二)

    SpringBoot初始教程之日志处理(二) 1.介绍 SpringBoot默认是采用logback进行日志处理.Logback是由log4j创始人设计的又一个开源日志组件.Logback是由log4 ...

  6. curl的使用(from 阮一峰)

    1.   http://www.ruanyifeng.com/blog/2011/09/curl.html 2.   https://curl.haxx.se/docs/httpscripting.h ...

  7. Linux经常使用命令(更新中)

    文件类: 1.创建目录:mkdir 例:sudo mkdir test 2.创建空文件:touch 例:sudo touch test.txt 3.删除文件:rm 删除文件不须要确认:rm -f 例: ...

  8. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  9. 单片机远程控制步进电机、LED灯和蜂鸣器

    通过採用C#语言实现的上位机控制单片机的步进电机模块.LED灯和蜂鸣器模块,使步进电机进行正.反转和停止并控制转速:LED灯模块进行有选择的呼吸式表达:蜂鸣器模块的開始和终止. 上位机通过串口和自己定 ...

  10. 如何离线分析Kafka海量业务消息?1分钟快速为您支招

    场景介绍 说起Kafka,许多使用者对它是又爱又恨.Kafka是一种分布式的.基于发布/订阅的消息系统,其极致体验让人欲罢不能,但操心的运维.复杂的安全策略.可靠性易用性的缺失等,仍需要使用者付出诸多 ...