关于JSP在浏览器中默认编码的问题? (20分)

  • 主题发起人 主题发起人 icool
  • 开始时间 开始时间
I

icool

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一chartest.jsp网页,内容如下:
<%@ include file="header.inc"%>
<table align="center" border="0" width="760" height="38" cellspacing="0">
<tr>
<td width="100%" align="center">
<h1>字符集问题</h1>
</td>
</tr>
</table>
</BODY>
</HTML>
其文件header.inc内容如下:
<HTML>
<HEAD><TITLE>222333</TITLE>
<META http-equiv=Content-Type content="text/html;charset=gb2312" >
<META content="MSHTML 5.00.2014.210" name=GENERATOR>
</HEAD>
<BODY bgColor=#ffffff leftMargin=0 topMargin=5 marginheight="5" marginwidth="5">
<table align="center" border="0" width="760" height="18" bgcolor="#3399FF" cellspacing="0">
<tr>
<td width="100%">
<p><a class="x" href="member/list_all_user.jsp">用户列表</a> |
<a class="x" href="book_store/index.jsp">商品列表</a>
</td>
</tr>
</table>
每当浏览该页时,浏览器中的编码总认为“西欧字符(iso)”,请问各位高手怎样设置
header.inc文件才能使浏览器中的编码认为“简体中文(GB2312)”。
 
在页面的开始加上:
<%@ page contentType="text/html;
charset=GBK" %>
<%
request.setCharacterEncoding("GB2312");
%>
 
to lnboy
谢谢你的答复!但我提的问题是如何在header.ini设置,来解决字符集问题。
不知你注意没有我的header.ini文件中有
<META http-equiv=Content-Type content="text/html;charset=gb2312" >
这条语句,然而在浏览器中却没有起到作用!
 
如果在http包的header里指定了其他编码,那么网页里的那句话是没有作用的。
参考:
http://www.delphibbs.com/keylife/iblog_show.asp?xid=1722
 
to lnboy
我只是一个JSP的初学者,对你的笔记内容还不能深刻的理解。我的问题只是想在jsp主文件里
include 一个头文件,从而避免每次写新的JSP文件时都要重复写<html><title>...</titld>之类
的标记,但问题是如上面的举例----浏览器不能正确识别该页面的字符集(注意:页面内字符内容不是乱码)。
不知道我的问题描述清楚没有,望lnboy大侠不吝笔墨,详细指导。
 

我没有试过include .inc后缀的文件。我只知道asp是可以这样的。
如果jsp里,
你可以include .jsp的文件啊。
下面就是你想要的,试试:
header.jsp
///////////////////////////////////////////////////////////////
<%@ page contentType="text/html;
charset=GBK" %>
<%
request.setCharacterEncoding("GB2312");
%>
<HTML>
<HEAD><TITLE>222333</TITLE>
<META http-equiv=Content-Type content="text/html;charset=gb2312" >
<META content="MSHTML 5.00.2014.210" name=GENERATOR>
</HEAD>
<BODY bgColor=#ffffff leftMargin=0 topMargin=5 marginheight="5" marginwidth="5">
<table align="center" border="0" width="760" height="18" bgcolor="#3399FF" cellspacing="0">
<tr>
<td width="100%">
<p><a class="x" href="member/list_all_user.jsp">用户列表</a> |
<a class="x" href="book_store/index.jsp">商品列表</a>
</td>
</tr>
</table>


chartest.jsp
//////////////////////////////////////////////
<%@ include file="header.jsp" %>
<table align="center" border="0" width="760" height="38" cellspacing="0">
<tr>
<td width="100%" align="center">
<h1>字符集问题</h1>
</td>
</tr>
</table>
</BODY>
</HTML>
 
to lnboy
上面的方法不行,这回浏览器对页面编码识别对了,但页面却出现了乱码!
 

所以我推荐你使用过滤器呀。
Tomcat自己的例子里也有的。
用过滤器对所有的页面进行编码处理。
很方便的,而且不会出问题。
 
to lnboy
这与过滤器无关,还是回到我的问题上来,怎样在header.inc(jsp)中设置
浏览器才能以正确的编码显示网页!(不是乱码问题)
 
不是与过滤器无关,jsp的中文问题历来已久,过滤器是解决中文问题的最简便方法。
你既然不愿意使用,
那你就在每个(注意每个,一个也不要少)jsp和servlet的开头(注意是在开头)都写上:
<%
request.setCharacterEncoding("GB2312");
%>
 
to lnboy
我说与过滤器无关,是因为加了过滤器后对该问题并没有起到作用。

之所以采用header.inc的方式,其中一个原因就是为了避免在每个页面中
重复敲入“request.setCharacterEncoding("GB2312");”这样的语句。
该方式的实质就是想代码重用,但却被浏览器不能自动识别字符集卡住了。
不知lnboy大侠是怎样解决这种方式编程的?

另外,可否告知你的QQ,这样方便与你请教!
 
to icool:不好意思,这几天忙自己的数据查询头都大了:(((
没有即使回复你,请见谅。
就以我的经验来看,
jsp里的最开始有一行:
<%@ page contentType="text/html;
charset=GBK" %>
Jbuilder和Jdevelop生成的默认的jsp里都会包含这一行,
有几次,我试着把它去掉。
只靠<%request.setCharacterEncoding("GB2312");%>作用,
最后也是出现乱嘛。(因为那个只是对request进行编码设置的,这十 用来保证提交的信息的编码能够正确)
而那一行<%@ page contentType="text/html;
charset=GBK" %>会被编译为:
response.setContentType("text/html;
charset=GBK");
这行才是保证页面显示的编码能够正常。
总结来看,每个页面最后这一行还是不能够放在include.jsp来实现的。


 
to lnboy
谢谢你在百忙之中回复我的问题。
既然过滤器能通过添加request.setCharacterEncoding("GB2312")解决乱码问题,
请问能否以某种形式通过添加response.setContentType("text/html;
charset=GBK")
解决浏览器对jsp的编码的识别问题?
 
to icool:
经过你一提醒,结合我前几天对过滤器的学习:
我想到了以下代码:
public voiddo
Filter(ServletRequest request, ServletResponse response, FilterChain filterChain) {
try {
request.setCharacterEncoding("GB2312");
filterChain.doFilter(request, response);
response.setContentType("text/html;charset=GBK");
}
catch(ServletException sx) {
filterConfig.getServletContext().log(sx.getMessage());
}
catch(IOException iox) {
filterConfig.getServletContext().log(iox.getMessage());
}
}
我大致说一下上面代码的意思吧,如果有不明白的地方,尽管问我:
Serlvet的过滤器是对每个http请求和回复都能够进行过滤的操作。
以这个解决中文问题的过滤器来说:
doFilter()首先执行的是request.setCharacterEncoding("GB2312");
意思是在把request交给真正的URL执行之前,先对修改request的信息,
将其编码设置为:GB2312。这一步只是保证URL对request处理的时候不出问题
然后 filterChain.doFilter(request, response);
是指把这个修改过后的请求交给下一个过滤器处理(如果下面没有过滤器了,则交给需要执行的URL)。
执行完上面的操作之后,整个request和response再次交回过滤器,此时我们可以开始执行
response.setContentType("text/html;charset=GBK");
这样就在把response交回客户端之前明确告诉它是GBK编码的。
这里才是保证页面正常显示的设置。
我猜测浏览器做的操作是,先在Http头里查找相关信息比如“text/html;charset=GBK”
来判断显示方式以及使用的编码,如果没有找到, 则再在html文件里
查找类似<META http-equiv=Content-Type content="text/html;charset=gb2312" >
的信息,再判断显示方式和使用的编码,如果还是没有找到,那么则使用默认的方式进行处理。
当然,Tomcat的默认是iso8859-1,我猜测它可能默认的在里面加了有这样的信息
(在我们没有自己修改相关信息的时候)。
好象Weblogic之类的则是可以在server的配置文件里设置所使用的编码的。
关于过滤器的具体相关知识,这里有篇好文章,你可以看看:
http://otn.oracle.com/global/cn/sample_code/tutorials/fbs/access/toc.htm
实在太感谢你了,在刚开始给你讲解问题的时候,我还以为我对这个问题已经够了解了,
现在才发现好多我以前没有注意到的地方,纯粹是一知半解,最近我太浮躁了:(((
当然我了解的东西不多,上面我所说的大多也是个人凭一点微薄的经验做出的推测,
没有找到相关资料来明确证实我的想法,有什么看法,还请多多交流。
 
to lnboy
再次谢谢你不厌其烦的讲解。
按你的方法设置了过滤器,浏览器可以正确识别编码,但是所有中文字符
却变成了乱码。因此还要麻烦你帮助分析一下。
另外,在向你请教的过程中我对过滤器的知识有了初步的了解,为此向你乐于
助人的精神致敬!
 
to icool:
如果可以的话,请大致描述一下你所使用的服务器,开发工具和操作系统等相关信息,
并请发一个有你提到的问题的例子程序给我。
我想,看着代码更容易帮你分析解决问题。
我的Email是:ln_boy@263.sina.com ,或者ln_boy@hotmail.com
 
to lnboy
邮件已发往: ln_boy@263.sina.com,谢谢!
 
to iscool:
已经回复你的邮件了,附件是几幅相关图片。
我暂时无法讲给你讲明白出现你的情况的具体原因,
但是我已经对原因有所了解,附件是我运行程序的抓图,
你先对比着看。结合最近的几篇文章你也许有所明白。
http://www.google.com/search?q=微软和联通有仇&amp;hl=zh-CN&amp;lr=lang_zh-CN
http://tech.sina.com.cn/s/n/2003-12-10/1541266585.shtml
 
to lnboy
看了你回复的邮件及程序抓图,发现解决问题的主要方法还是要在JSP文件头中插入
<%@ page contentType="text/html;charset=GBK" %>语句。在这儿我想问,如果不
插入以上语句凭过滤器中设置的response.setContentType("text/html;charset=GBK")
语句能否解决编码识别问题?
 
to iscool:
你看我的抓图和我告诉你的文章之后,你应该明白,真正导致这个问题的出现,
已经不在编码的设置上了,而是你的源文件的保存的编码上不一致,造成Tomcat在编译jsp的时候,就写入了不同编码的字符,因此无法在页面上全部都正确显示。
当你源文件能够正常被编译之后,那么,过滤器的
response.setContentType("text/html;charset=GBK")是可以有效的。
但你也要注意,这行代码设置了文本类型为:text/html,因此这个过滤器的作用范围应该是输出为html的文件,而如果不恰当的把其它类型的也过滤了,比如你把过滤器的过滤范围设置为 /*,将导致jpg,gif等其它类型无法正常显示,这方面的细节,请看与过滤器相关的介绍。
 
后退
顶部