在jb8中编写、保存的jsp文件的时候通常会出现这种错误(在状态栏中提示)
com.borland.primetime.util.assertionexception: gbk
而并不能正确保存jsp文件。
个人修改办法如下:
这个问题我在用jb8编写jsp文件时候发现的,现在本人已基本解决(但是改动了jdk类库里一些代码)
首先我解析一下原因:
jb8这个问题只出现在jsp文件中,而java代码则没有问题
我们用jb(所有jb8以前的版本)编写程序的时候,项目的编码(encoding)应该是gbk(注意是大写)
这样我们编写java代码的时候用的就是gbk,在jb8以前版本中,java文件和jsp文件的用的都是项目编码
(如:gbk),因此所有文件都用gbk编写
到了jb8就把java文件和jsp文件分开了,java继续用项目的编码,而jsp则根据jsp文件头的
<%@ page contenttype="text/html;charset=[encoding]"%>
中[encoding](如gbk、gb2312)来读取、编写和写入文件,如果没写明则用iso-8859-1(这个编码的写
法也有问题,后面会有说明修改的方法),但这里用gbk编写代码的时候则jb8莫名其妙的把gbk改为小写
gbk(borland程序员写错还是其他原因?!谁知道!),而在jdk类库中并没有这中编码(java是区分大
小写的),因此就出现以上的错误:
com.borland.primetime.util.assertionexception: gbk
解决方法:
在用我的修改方法前,大家错好能找些关于java字符集(支持的编码)的资料(论坛精华区有资料)
我这里修改的jdk的类库,并不修改jb8的代码(jb8太庞大,找起来不好找)
在jdk类库中负责编码别名转换类是sun.io.characterencoding(在rt.jar包中,jdk目录是jdk1.4\jre\
lib)
这解析一下别名,
java中支持的编码比较多,如:iso8859_1,gb2312,gbk等,而java是区分大小写的,如果我把iso8859_1
写成iso8859_1,java会出错的,就像jb8把gbk写成gbk就出错了,那java错了一些容错处理,当他读到
某些并不是自己支持的编码是就会去找sun.io.characterencoding,看看这里有没有对应的编码转换,
如果有则转成标准的编码,这里我们这些写得并不标准得编码成为编码得别名,而编码得别名可能会有
很多(这个跟操作系统有关,如iso8859_1就有很多中写法:iso_8859-1,iso8859_1)
别名具体的英文名字解析我不记得了,我自己按自己的理解把它叫做别名
接着我简要说明一下sun.io.characterencoding是怎样实现别名的转换
说起来很简单,就是用一个hashmap做key与value的对应表
sun.io.characterencoding部分编码如下(用jad反编译出来的)
((hashmap) (obj)).put("us-ascii", "ascii");
((hashmap) (obj)).put("ascii", "ascii");
((hashmap) (obj)).put("646", "ascii");
((hashmap) (obj)).put("iso_646.irv:1983", "ascii");
((hashmap) (obj)).put("ansi_x3.4-1968", "ascii");
((hashmap) (obj)).put("iso646-us", "ascii");
((hashmap) (obj)).put("default", "ascii");
((hashmap) (obj)).put("ascii7", "ascii");
((hashmap) (obj)).put("8859_1", "iso8859_1");
((hashmap) (obj)).put("iso_8859-1:1987", "iso8859_1");
((hashmap) (obj)).put("iso-ir-100", "iso8859_1");
((hashmap) (obj)).put("iso_8859-1", "iso8859_1");
((hashmap) (obj)).put("iso-8859-1", "iso8859_1");
((hashmap) (obj)).put("iso8859-1", "iso8859_1");
。。。。。
这个对应表比较大,但找起来并不困难
对照前面jb8的问题,我们很容易就找到原因所在,这个对应表中并没有gbk和gbk的对应!!!!
那我们就知道如何解决了,自己加!!!
((hashmap) (obj)).put("gbk", "gbk");
(【现在不知道有没有记错】后来我同时发现jb8也写错了一个编码iso-8859_1,这个在对应表中也没有
,所以建议大家也加上:
((hashmap) (obj)).put("iso_8859-1", "iso8859_1");
)
然后编译自己sun.io.characterencoding,然后加到jb8的jdk1.4的rt.jar包中即可
(怎样操作请参考jar.exe的说明,在命令窗口运行jar就有帮助)
以后jb8就不会出错了!哈哈 :)
如果对本人理解不认同或有更好的解决方法请指出,欢迎讨论。
