转自
一个BUG的快速解决方法.希望能给大家的一些启示朋友打来电话,他们公司新装了TOMCAT5,然后在编译JSP时,被INCLUDE的JSP都出现了问题.就是编译后被INCLUDE的地方多了两个"??"而其它正常,而如果手工把被INCLUDE的内容COPY上去测没有问题.
他们的工程师都不知道是什么问题,因为周一要发布出去,所以非常着急.
我不知道大家听到这种情况会如何,我知道大多数人比我聪明,你肯定想到了,所以你没有必要再看了.我下面的内容只是对没有想到的人而言.
其实他电话还没打完 ,我就知道问题99%是他的jsp在编辑的时候是存为UTF-8而不是ANSI格式,否则没有道理出现这种问题,事实正是如此,我让他用UE打开看看果然前面多了几个UTF字符.
重要的是TOMCAT这种容器竟然有这样的BUG,不能正确读取UTF-8格式的文件,你总不能强求用户编辑JSP文件时一定要存为什么格式吧?
费话少说,下载tomcat5的src,进入jakarta-tomcat-jasper\jasper2\src\share\org\apache\jasper\compiler,找到JspUtil.java,找到
public static InputStream getInputStream(String fname, JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
throws JasperException, IOException {
InputStream in = null;
if (jarFile != null) {
String jarEntryName = fname.substring(1, fname.length());
ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
if (jarEntry == null) {
err.jspError("jsp.error.file.not.found", fname);
}
in = jarFile.getInputStream(jarEntry);
} else {
in = ctxt.getResourceAsStream(fname);
}
if (in == null) {
err.jspError("jsp.error.file.not.found", fname);
}
return in;
}
在return in前加上判断,改成:
public static InputStream getInputStream(String fname, JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
throws JasperException, IOException {
InputStream in = null;
if (jarFile != null) {
String jarEntryName = fname.substring(1, fname.length());
ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
if (jarEntry == null) {
err.jspError("jsp.error.file.not.found", fname);
}
in = jarFile.getInputStream(jarEntry);
} else {
in = ctxt.getResourceAsStream(fname);
}
if (in == null) {
err.jspError("jsp.error.file.not.found", fname);
}
PushbackInputStream testin = new PushbackInputStream(in);
int ch = testin.read();
if (ch != 0xef) {
testin.unread(ch);
}
else if ((ch = testin.read()) != 0xbb) {
testin.unread(ch);
testin.unread(0xef);
}
else if ((ch = testin.read()) != 0xbf) {
throw new IOException("错误的UTF-8格式文件");
}
else{
//fStream.setEncoding("UTF-8");
testin.read();
}
return testin;
}
编译,重新打包,替换原来的包,运行TOMCAT,OK!
整个问题解决除了远程登录他的服务器传送文件的时间,总共只有4-5分钟.其实只要问题定位准确,就不难解决了.我一再强调的是经熟悉底层,你如果知道内
存中每个byte从哪儿来要到哪儿去,就可以非常容易地解决问题.在此之前我连TOMCAT5下载都没有下过,更别说试用了.但只要你对JDK有深入的了
解,就可以准确地定位问题的所在.
希望本文能给不是高手的朋友一点帮助和启发,对于高手的朋友你可以弃之一笑.
UTF-8文件的Unicode签名BOM(Byte Order Mark)问题utf-8编码include页面空格Django下碰到EF BB BF问题php utf-8编码include页面空格