jsp编码设置问题

收藏,8.2k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我就不明白了。。我写了两个jsp文件,编码均为utf-8,一个就能正常显示中文,另一个则不能。。。求解啊正常显示中文的jsp:&%@ page language=&java& contentType=&text/ charset=utf-8&
pageEncoding=&utf-8&%&
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=utf-8&&
&title&站内检索索引建立页面&/title&
&script type=&text/javascript&&
function checkForm(form){
if(form.toIndexPage.value==&&||form.toIndexPage.value==null){
alert(&请输入要建立索引的网站!&);
form.toIndexPage.focus();
&form action=&&%=request.getContextPath()%&/IndexServlet&
METHOD=&post& onsubmit=&return checkForm(this)&&
&%--查询表单
&B&输入要建立索引的网站:&/B&
&INPUT TYPE=text NAME=&toIndexPage& SIZE=30 VALUE=&&&
&INPUT TYPE=submit VALUE=&查询&&
&/html&乱码显示中文的jsp&%@ page contentType=&text/ charset=utf-8& language=&java& import=&java.sql.*,java.util.*,java.text.*& pageEncoding=&utf-8& %&
&% request.setCharacterEncoding(&utf-8&); %&
&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN& &http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&
&html xmlns=&http://www.w3.org/1999/xhtml&&
&meta http-equiv=&Content-Type& content=&text/ charset=utf-8& /&
&title&站内检索系统检索页面&/title&
&style type=&text/css&&
font-family: &仿宋&;
font-size: 18
font-family: &黑体&;
font-weight:
&div align=&center& class=&STYLE2&&
&h1&站内检索系统&/h1&
&p align=&center& class=&STYLE1&&索引建立成功:&%=request.getAttribute(&WebName&) %&&/p&
&p align=&center& class=&STYLE1&&请输入检索内容:
&input type=&text& name=&textfield& /&
&input type=&submit& name=&Submit& value=&检索& /&
&div align=&center&&当前时间:&%String mydate=new SimpleDateFormat(&yyyy-MM-dd HH:mm:ss&).format(Calendar.getInstance().getTime());%&
&%=mydate%&&/div&
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
大概是因为一个是utf-8编码,一个是utf-8 +bom的编码,两种的区别在视觉上是看不出来的。你放到eclipse中统一改成utf-8的就好了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
查一下JSP文件自身编码
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
请问是不是这一句代码生成的文字是乱码?&%=request.getAttribute(&WebName&) %&&/p&JSP里面通过request传送参数之后,会自动变为ISO8859-1的编码,所以从request中读取参数的时候,还需要设置这个取值的编码为UTF-8。你可以看看JSP的教材上应该有讲解。我也已经很久没有接触过JavaWeb了,如果有错误,还希望多多指教!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
jsp文件自身的编码。如果你用myeclipse编写的话,要去修改一下新建文件时的默认编码。
同步到新浪微博
分享到微博?
与我们一起探索更多的未知
专业的开发者技术社区,为用户提供多样化的线上知识交流,丰富的线下活动及给力的工作机会
加入只需一步
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
举报理由:
推广(招聘、广告、SEO 等)方面的内容
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复(请编辑该提问指向已有相同问题)
不友善内容
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:
扫扫下载 App
SegmentFault
一起探索更多未知解决jsp参数传递乱码的问题 -
- ITeye技术网站
博客分类:
计算机生于美国,英语是他的母语,而英语以外的其它语言对他来说都是外语。他跟我们一样,不管外语掌握到什么程度,也不会像母语那样使用得那么好,时常也会出一些“拼写错误”问题。
乱码的出现根本原因在于编码和解码使用了不同的编码方案。比如用GBK编码的文件,用UTF-8去解码结果肯定都是火星文。所以要解决这个问题,中心思想就在于使用统一的编码方案。
jsp页面间的参数传递有以下几种方式:1、表单(form)的提交。2、直接使用URL后接参数的形式(超级链接)。3、如果两个jsp页面在两个不同的窗口中,并且这两个窗口是父子的关系,子窗口中的jsp也可以使用javascript和DOM(window.opener.XXX.value)来取得父窗口中的jsp的输入元素的值。下面就前两种方式中出现的乱码问题做一下剖析。
1、表单(form)的提交实现参数页面间的传递
在介绍表单传递参数的内容之前,先来了解一些预备知识。表单的提交方式和请求报文中对汉字的处理。
表单的提交方式:
通常使用的表单的提交方式主要是:post和get两种。两者的区别在于:post方式是把数据内容放在请求的数据正文部分,没有长度的限制;get方式则是把数据内容直接跟在请求的头部的URL后面,有长度的限制。下面是同一个页面两种方式的请求报许文。
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&Insert title here&/title&
&%-- post方式提交表单 --%&
&form action="http://localhost:8888/EncodingTest/requestresult.jsp" method="post"&
UserName:&input type="text" name="username"/&
Password:&input type="password" name="password"/&
&input type="submit" value="Submit"&
在上面的请求页面的username输入框里输入的是“世界杯”三个汉字,password输入框中输入"123"后按下Submit按钮提交请求。截获到的请求报文如下:
POST /EncodingTest/requestresult.jsp HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 ( MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft- .NET CLR 2.0.50727)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8888
Content-Length: 49
Connection: Keep-Alive
Cache-Control: no-cache
username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123
以上报文内容,可以看出post方式的请求报文是有专门的数据部的。,
下面的同一请求页面的get提交方式的请求报文:
GET /EncodingTest/requestresult.jsp?username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123 HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 ( MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft- .NET CLR 2.0.50727)
Accept-Encoding: gzip, deflate
Host: localhost:8888
Connection: Keep-Alive
以上报文内容,可以看出get方式的请求报文没有专门的数据部,数据是直接跟在url的后面。
请求报文中对汉字的处理:
从上面两种报文可以看出页面上输入的“世界杯”三个汉字被替换成了"%E4%B8%96%E7%95%8C%E6%9D%AF”这样一个字符串,然后发给服务器的。看到这,可能会有两个问题:问题一、这个字符串是什么?问题二、为什么要做这样的替换?
这个字符串是“世界杯”这三个汉字对应的"UTF-8”编码"E4B896E7958CE69DAF"在每个字节前追加一个"%"后形成的。至于为什么要做这样的转化,我的理解是:因为请求报文会以"ISO-8859-1"的编码方式编码后,通过网络流的方式传送到服务器端。"ISO-8859-1"仅支持数字、英文字母和一些特殊字符,所以像汉字等这样的字符"ISO-8859-1"是不认识的。所以就必须先给这些"ISO-8859-1"不支持的字符做个“整形”手术。这样才能正确的将页面上的信息传送到服务器端。
这时可能又会有另外一个问题:上面的例子中为什么会选用"UTF-8"编码,其它的编码方案可以吗?答案是可以的。在jsp页面代码的头部有这样一段代码"&%@ page language="java" contentType="text/ charset=UTF-8" pageEncoding="UTF-8"%&"其中charset的值就是浏览器在提交请求报文前,对请求报文做“整形”手术时用的字符集,同是也是浏览器解释服务器的响应页面时的字符集。
在了解了以上内容后,开始剖析表单方式传递参数的乱码问题。
以上例为例,点击"Submit"按钮后,浏览器将做完“整形”手术后的请求报文发送给WEB服务器上的Servlet容器,容器在收到这个请求报文后,会解析这个请求报文并用这个报文的信息生成一个HttpServletRequest对象,然后将这个HttpServletRequest对象传给这个页面所要请求的jsp或Servlet(上例中为"requestresult.jsp")。在这个被请求的jsp或Servlet(上例中为"requestresult.jsp")中,使用HttpServletRequest对象的getParameter("")方法来取得上一页面传来的参数。默认情况下,这一方法使用的是"ISO-8859-1"来解码,所以对于英文或数字的参数值自然能正确取得,但对于汉字这样的字符是解不出来的,因为那几个汉字曾经做过“整形”手术,已经认不出来了。要想再把它们认出来,那就得要把手术的主刀医生找到,然后再做一次“还原”手术。下面提供的几个方案,可用于不同的情况。
&%String str = new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8"); %&
Username:&%=str %&
既然request.getParameter("username")默认情况下返回的字符串是用"ISO-8859-1"解出来的,那就先把这个不可辨认的字符串再用"ISO-8859-1"来打散,也就是:request.getParameter("username").getBytes("ISO-8859-1")。最后再用跟你的页面的charset一致的字符集来重组这个字符串:new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8")。这样就能见到它的庐山真面目了。
方案一是一种比较万能的方法,不管是post还是get都适用,但可以看出它的缺点是:对于每个可能出现汉字的参数都要显示的做这么一段处理。一个两个还行,要是很多的话,那就应该考虑一下是不是可以选用下一种方案。
&%request.setCharacterEncoding("UTF-8"); %&
方案二是在页面的最开始或者是在该页面中使用的第一个request.getParameter("")方法之前加上上述一段代码,它的作用是用作为参数传入的编码集去覆盖request对象中的默认的"ISO-8859-1"编码集。这样request.getParameter("")方法就会用新的编码集去解码,因为"UTF-8"支持中文,所以作为参数传过来的“世界杯”三个汉字就能正确的接收到了。但关于request.setCharacterEncoding("")方法,API文档中有如下的说明:
Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader(). Otherwise, it has no effect.
所以方案二只对post方式提交的请求有效,因为参数都在request的body区。而对get方式提交的请求则是无效的,这时你会发现同样的做法但显示的还是乱码。所以你的请求要是是以get方式提交的话,那你还是乖乖的选用方案一吧!
从上面的叙述可以知道,方案二需要在每个页面的前头加上&%request.setCharacterEncoding("UTF-8"); %&这段代码,这样做是不是也挺累的,所以我们想到了使用过滤器来帮助我们做这件事儿,那就清爽、简单多了。
public class EncodingFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//用init方法取得的charset覆盖被拦截下来的request对象的charset
request.setCharacterEncoding(this.charset);
//将请求移交给下一下过滤器,如果还有的情况下。
chain.doFilter(request, response);
public void init(FilterConfig config) throws ServletException {
//从web.xml中的filter的配制信息中取得字符集
this.charset = config.getInitParameter("charset");
要想这个过滤器生效,还得到web.xml里加入下面的配制信息。
&filter-name&EncodingFilter&/filter-name&
&filter-class&cn.eric.encodingtest.filter.EncodingFilter&/filter-class&
&init-param&
&param-name&charset&/param-name&
&param-value&UTF-8&/param-value&
&/init-param&
&filter-mapping&
&filter-name&EncodingFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
2、直接使用URL后接参数的形式(超级链接)。
有些时候可能会遇到通过一个超级链接来把参数传到下一个页面,而刚好这个参数的值有可能会出现中文的情况。就像下面这样:
&a href="./jstlresult.jsp?content=世界杯"&Go South Africa&/a&
跟form提交有些不同的是:当你点击这个超级链接后在浏览器的地址栏里看到的是http://localhost:8080/TomcatJndiTest/jstlresult.jsp?content=世界杯,而不是http://localhost:8080/TomcatJndiTest/jstlresult.jsp?content=%E4%B8%96%E7%95%8C%E6%9D%AF
这里浏览器并没有帮我们把这个转化工作搞定,所以这里要自己动手,丰衣足食了。做法如下:
&a href="./jstlresult.jsp?content=&%=java.net.URLEncoder.encode("世界杯","utf-8") %&"&Go South Africa&/a&
这样的话在第二个页面就能使用&%String str = new String(request.getParameter("content").getBytes("ISO-8859-1"),"utf-8"); %&的方法来正确的得到这个参数值了。
总结一下:
1、post提交的方式:使用过滤器,将到达页面前的request对象中的字符编码设定成跟你页面统一的编码。
2、get提交的方式:&%String str = new String(request.getParameter("content").getBytes("ISO-8859-1"),"utf-8"); %&这样的字符串重组的方法。
3、超级链接方式:先将链接url中的汉字用java.net.URLEncoder.encode("paramValue","charset")方法处理一下,下面的做法参照2。
ericliu1986
浏览: 52286 次
来自: 天津
此博客对我有用!
yangxue00 写道弱弱的问一下,红色字体部分是你从log ...
弱弱的问一下,红色字体部分是你从logcat中复制过来的吗?? ...如何解决JSP页面显示乱码问题
&一、JSP页面显示乱码二、表单提交中文时出现乱码三、数据库连接时出现乱码大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。一、JSP页面显示乱码下面的显示页面(display.jsp)就出现乱码:&%out.print(&JSP的中文处理&);%&对不同的和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一行加上:英文代码&%@ page contentType=&text/ charset=gb2312&%&就可以消除乱码了。完整页面如下:&%@ page contentType=&text/ charset=gb2312&%&&%out.print(&JSP的中文处理&);%&二、表单提交中文时出现乱码下面是一个提交页面(submit.jsp),
【声明】:黑吧安全网()登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱,我们会在最短的时间内进行处理。
上一篇:【】【】在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的JSP中文乱码问题有如下几个方面:页面乱码、参数乱码、表单乱码、源文件乱码。下面来逐一解决其中的乱码问题。
一、JSP页面中文乱码
在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码。
先看一个JSP程序:
&%@ page language=&java& import=&java.util.*&
&title&中文显示示例&/title&
这是一个中文显示示例:
String str = &中文&;
out.print(str);
上面这个JSP程序看起来好像是在页面显示几句中文而且标题也是中文。运行后在浏览器中显示如图所示
原因在于没有在JSP中指定页面显示的编码,消除乱码的解决方案很简单上面代码中page命令修改成如下所示即可
&%@ page language=&java& import=&java.util.*& contentType=&text/ charset=GB2312& %&
&title&中文显示示例&/title&
这是一个中文显示示例:
String str = &中文&;
out.print(str);
再次运行乱码消失,原理就是向页面指定编码为GB2312,那么页面就会按照此编码来显示,于是乱码消失。
二、URL传递参数中文乱码
一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。
下面是一个示例程序
&%@ page language=&java& import=&java.util.*& contentType=&text/charset=gb2312&%&
&title&URL传递参数中文处理示例&/title&
String param = request.getParameter(&param&);
&a href=&URLCharset.jsp?param='中文'&&请点击这个链接&/a&&br&
你提交的参数为:&%=param%&
上面这个JSP程序的功能就是通过一个URL链接向自身传递一个参数,这个参数是中文字符串,这个程序的运行效果如下图
对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。在这里修改Tomcat的conf目录下的server.xml配置文件,具体改后的代码如下
&Connector port=&8080& protocol=&HTTP/1.1& URIEncoding=&gb2312&
connectionTimeout=&20000&
redirectPort=&8443& /&
在原来代码中添加URI编码设置URIEncoding=“gb2312”即可,重启Tomcat服务器可以得到正确的页面。其原理也和上面的情况类似,就是向程序指明编码类型,然后显示就正常了。
三、表单提交中文乱码
对于表单的数据可以使用request.getParameter(“”)的方法获取,但是当表单中出现中文数据的时候就会出现乱码。
示例代码如下
&%@ page language=&java& import=&java.util.*& contentType=&text/charset=gb2312&%&
&title&Form中文处理示例&/title&
&font size=&2&&
下面是表单内容:
&form action=&AcceptFormCharset.jsp& method=&post&&
用户名:&input type=&text& name=&userName& size=&10&/&
码:&input type=&password& name=&password& size=&10&/&
&input type=&submit& value=&提交&&
在上面的表单当中想AcceptFormCharset这个页面提价两项数据,下面是AcceptFormCharset.jsp的内容:
&%@ page language=&java& import=&java.util.*&
contentType=&text/charset=gb2312&%&
&title&Form中文乱码&/title&
&font size=&2&& 下面是表单提交以后用request取到的表单数据:&br&
String userName = request.getParameter(&userName&);
String password = request.getParameter(&password&);
out.println(&表单输入userName的值:& + userName + &&br&&);
out.println(&表单输入password的值:& + password + &&br&&);
在上面的程序中,如果表单输入没有中文,则可以正常的显示当输入的数据中有中文的时候,得到的结果如图所示。
产生种结果的原因是Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。对于这个问题可以采用转换编码格式的方法来解决,现在对AcceptFromCharset这个页面改动如下:
&%@ page language=&java& import=&java.util.*&
contentType=&text/charset=gb2312&%&
&title&Form中文乱码&/title&
&font size=&2&& 下面是表单提交以后用request取到的表单数据:&br&
String userName = request.getParameter(&userName&);
String password = request.getParameter(&password&);
out.println(&表单输入userName的值:& + new String(userName.getBytes(&ISO-8859-1&), &gb2312&)+ &&br&&);
out.println(&表单输入password的值:& + new String(password.getBytes(&ISO-8859-1&), &gb2312&)+ &&br&&);
经过这样的转换编码以后,所有的中文输入都可以用request对象正常取出。在上面这个程序中,第四行和第五行是转换编码格式的关键,先从ISO-8859-1格式的字符串中取出字节内容,然后在用GB2312的编码格式重新构造一个新的字符串。这样就可以支持中文变淡输入的正常取值和显示。改进以后程序运行结果如下
经过上面的更改编码格式的处理,表单的中文输入乱码问题已经得到解决。但是如果上面的表单中的输入项不止是两个,那么每个输入项都需要进行编码转换,那样就很麻烦了。这是我们就用到了大名鼎鼎的过滤器filter了。关于这里的内容大致的思虑和上面的一样具体做法请参照笔者的。
四、Eclipse中JSP文件中文乱码
在Eclipse或者MyEclipse中由于默认的JSP编码格式为ISO-8859-1,所以当打开由其他编辑器编辑的JSP文件时会出现乱码,如图所示
对于这个问题我们只需要更改一下Eclipse或者是MyEclipse中对JSP的默认编码就可以了,修改的地方(我的MyEclipse版本为11)如图所示
在Eclipse或者MyEclipse当中JSP文件默认的编码为ISO-8859-1,所以在JSP代码中间如果出现中文就不能保存,例如如下代码
&%@ page language=&java& import=&java.util.*& %&
&title&中文显示示例&/title&
这是一个中文显示示例:
String str = &中文&;
out.print(str);
修改后在保存的时候会提示如下:
现这个提示的原因在于JSP源文件中有ISO=8859-1编码无法识别的中文字符,对于这个问题,解决办法就是在JSP页面中声明页面编码格式即可。声明后代码如下:
&%@ page language=&java& import=&java.util.*&
pageEncoding=&GB2312& %&
&title&中文显示示例&/title&
这是一个中文显示示例:
String str = &中文&;
out.print(str);
其中第一行中pageEncoding=“gb2312”指明了JSP页面编码采用GB2312,这样就可以正常保存JSP的源文件了。
遇到问题首先分析问题出现的原因,只有知道了原因才能去解决,学习分析问题的来源远比解决这个问题重要的多。
乱码问题的原因就是程序(Eclipse也好,浏览器也罢)的编码没有和编程人员的编码进行统一,(就像你和一个不懂中文的人用中文交流他当然不懂了)那么解决这个问题只需要将编程人员想要的编码告诉程序就可以了,以上解决乱码问题的种种方法都可以说是一种声明编码的过程,也就是说乱码问题终极解决方案就是:转码。这里的转码要么是编程人员手动转,要么就是声明一下让程序去转,换句话说就是:和不懂中文的交流,要么让他学中文,要么你就去学习他的语言。
生活就是编程,编程就是生活,同之,通之!!!
阅读(...) 评论()}

我要回帖

更多关于 myeclipse jsp 编码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信