标签的编码问题

有两个页面,console.jspmenu.htm,代码如下:

 

...
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
...
<c:import url="menu.htm"/>
...

 

 

其中,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中加入

上面两种都可以避免乱码的出现(...应该是吧)

 

附件是jakarta-taglibs-standard-1.1.2-src.zip~

 

 

 

 

 

你可能感兴趣的:(apache,C++,c,jsp,C#)