<c:import>标签的编码问题

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

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值