有两个页面,console.jsp和menu.htm,代码如下:
... <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> ... <c:import url="menu.htm"/> ...
<div> ... </div>
其中,console.jsp设置charset为"UTF-8",并使用<c:import>标签引入了menu.htm(menu.htm使用UTF-8编辑).
直接打开menu.htm,然后将页面的Encoding设置为Unicode(UTF-8),字符可以正确显示.
但打开console.jsp时,import进来的内容却出现乱码现象.
为<c:import>设置charEncoding="UTF-8"后,问题才得以解决.
... <c:import url="menu.htm" charEncoding="UTF-8"/>' ...
可为什么console.jsp中已经设置了charset,引入menu.xml时还会出现乱码呢?
查看JSTL的源码后得到了答案(我查看的是jakarta-taglibs-standard-1.1.2-src.zip中的代码).
在org.apache.taglibs.standard.tag.common.core.ImportSupport(<c:import>的实现类)中发现如下代码:
public static final String DEFAULT_ENCODING = "ISO-8859-1";
...
// handle absolute URLs ourselves, using java.net.URL
URL u = new URL(target);
URLConnection uc = u.openConnection();
InputStream i = uc.getInputStream();
// okay, we've got a stream; encode it appropriately
Reader r = null;
String charSet;
if (charEncoding != null && !charEncoding.equals("")) {
charSet = charEncoding;
}
else {
// charSet extracted according to RFC 2045, section 5.1
String contentType = uc.getContentType();
if (contentType != null) {
charSet = Util.getContentTypeAttribute(contentType, "charset");
if (charSet == null) charSet = DEFAULT_ENCODING;
}
else {
charSet = DEFAULT_ENCODING;
}
}
从上面的代码可以看出,如果不设置charEncoding,标签将会查看目标页的编码(menu.htm中没有设置content-type,所以得到的contentType为null),charSet 最终被设置为DEFAULT_ENCODING,即"ISO-8859-1".导致乱码的出现.
PS:
可以建立一个Filter,并加入下面的代码:
... response.setCharacterEncoding("UTF-8"); ...
也可以在menu.htm中加入
... <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> ...
上面两种都可以避免乱码的出现(...应该是吧)
附件是jakarta-taglibs-standard-1.1.2-src.zip~