但是我们往往忽略掉这个参数,因此这样往往会有跨平台的问题: 例3在中文平台上编译,生成ZhClass 例3在英文平台上编译,输出EnClass 1.ZhClass在中文平台上执行OK,但是在英文平台上不行 2.EnClass在英文平台上执行OK,但是在中文平台上不行 原因: 1.在中文平台上编译后,其实str在运行态的char[]是0x4F60,在中文平台上运行,FileWriter的缺省编码是gb2312,因此CharToByteConverter会自动用调用gb2312的converter,把str转化成byte输入到FileOutputStream中,于是0xC4,0xE3放进了文件。但是如果是在英文平台下,CharToByteConverter的缺省值是8859_1,FileWriter会自动调用8859_1去转化str,但是他无法解释,因此他会输出"?". 在英文平台上编译后,其实str在运行态的char[]是0x00C4 0x00E3, --在中文平台上运行,中文无法识别,因此会出现?? 在英文平台上,0x00C4-->0xC4,0x00E3->0xE3,因此0xC4,0xE3被放进了文件 1.对于JSP正文的解释: Tomcat首先看一下你的页面中有没有"<%@page include的符号。有,则在相同地方设定response.setContentType(..);按照encoding的来读,没有他按照8859_1读取文件,然后用UTF-8写成.java文件,然后用sun.tools.Main去读取这个文件,(当然它使用UTF-8去读),然后编译成class文件setContentType改变的是out的属性,out变量缺省的encoding是8859_1 2.对Parameter的解释 很不幸Parameter只有ISO8859_1的解释,这个质料可以在servlet的实现代码中找到。 3.对include的解释 格式的,但是很不幸,由于那个写"org.apache.jasper.compiler.Parser"的人 在数组JspUtil.ValidAttribute[]忘记加了一个参数:encoding,因此导致不支 持这种方式。你完全可以编译源代码,加上对encoding的支持 总结: 如果你在NT底下,最简单的方法就是欺骗java,不加任何Encoding变量:
| <html> 你好<%=request.getParameter("value")%> </html> http://localhost/test/test.jsp?value=你 |
结果:你好你 但这种方法局限性较大,比如对上传的文章分段,这样的做法是死定的,最好的 解决方案是用这种方案:
| <%@ page contentType="text/html;charset=gb2312" %> <html> 你好<%=new String(request.getParameter("value").getBytes("8859_1"),"gb2312")%> </html> |
|