有两个页面,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~