项目为了解决GBK字符不够用的问题,主要是特殊字符的问题,决定赶追国际潮流采用UTF-8作为我们统一的编码方式。于是这里边虽然支持的编码增加了,但是也出现了一系列的问题。
1,模板的搭配。
由于使用了Struts的tiles标签来进行网页布局,所以外层一定要用utf-8,原来实验室的经验是在内层采用gbk,并且别证明是够用的,但是我们决定在这个项目里统一使用utf-8,当初也没想到后来会出现问题。
这样首先出现的问题是jsp文件的编码问题,原来使用GBK编码的一些文件,在编码突然变化到utf-8的时候显得很不适应,后来终于在Eclipse,EditPlus的帮助下完成了编码的转换,在页面里边能够很好的显示出中文了。
2,js文件问题。
由于系统使用了很多编码转换的js,所以使用了简单的jsp来根据数据库中的编码来生成js。比如报名过程中要求学员选择项目和班次,采用下拉菜单的形式就比较简单。但是这样就出现了问题,按照不设定编码的方式来生成js文件:
1 //写文件
2 StringBuffer buf1 = new StringBuffer();
3 FileWriter filew1 = new FileWriter("F:\\eclipse\\workplace\\jxjy\\WebRoot\\js\\"+"xm.js");
4 //System.out.println(filew1.getEncoding());
5 BufferedWriter fw1=new BufferedWriter(filew1);
然后构造buf1也就是js文件的内容,并使用下列代码完成写的过程:
1 fw1.write(new String(buf1.toString());
2 fw1.flush();
3 fw1.close();
4 fw1=null;
5 buf1.delete(0,buf1.length()-1);
这样生成的文件,在utf-8的jsp页面中被
<script language="javascript" src="<%=cxp%>/js/xm.js"></script>
试图引入的时候发现引入不进来。
刚开始根本想不到是utf-8编码的问题,反反复复找函数的问题,后来确信绝对没有问题才开始想别的地方,终于想到字符编码问题。
先是用EditPlus来把xm.js文件转换成utf-8格式,然后奇迹般的发现居然work了。
后来数据库不断的更换,每次都要求重新生成js文件,这样就搞得我们每次都要用EditPlus转换一遍,这样很不爽。没有办法了必须要通过程序的途径来形成能够直接使用的js文件。
那么首先就看代码各个环节中涉及到编码的地方有哪里,结果发现在StringBuffer里边可以由String进行编码设定,先试验这个。我分别在
fw1.write(new String(buf1.toString().getBytes("UTF-8"),"UTF-8"));
这句话里边试过各种编码,从ISO-8859-1到UTF-8,甚至UTF-16,前后怎么换都出不来。
后来我只好去查UTF-8的编码。发现了一个
讲的特别仔细的文章。后来,我记得原来在转换编码的时候也用过UltreaEdit,而且比EditPlus编码好像要复杂,于是用UltreaEdit打开文件,另存,果然发现有多种编码形式。经过试验采用utf-8 no bom的形式就可以被网页正确引入。于是又去查这个bom,最后也没有找到在java里边的名称。搞得我心灰意冷。
这时,我又查了一下
FileWriter发现提供一个getEncoding()的方法,于是把第一段代码中注释的一段去掉打印出来发现是GBK。返回头去看jsp的编码,这个居然没有改成utf-8,原来是这个问题,马上改过来。可是改过来再去试还是不对。打印出来仍然是GBK,看来不是JSp文件的问题。这个问题还真麻烦。查了一下文件输出流的几个类之间的继承关系,发现在指定输出文件的时候也可以用OutputStreamWriter这个基类来代替FileWriter,可以在OutputStreamWriter里边设定编码。
修改过之后变成下边这个样子:
1 StringBuffer buf1 = new StringBuffer();
2 OutputStream os1= new FileOutputStream("F:\\eclipse\\workplace\\jxjy\\WebRoot\\js\\"+"xm.js");
3 OutputStreamWriter osw1 = new OutputStreamWriter(os1,"UTF-8");
4 //System.out.println(osw1.getEncoding());
5 BufferedWriter fw1=new BufferedWriter(osw1);
6 //.中间构造buf1.
7 fw1.write(new String(buf1.toString().getBytes("UTF-8"),"UTF-8"));
8 fw1.flush();
9 fw1.close();
10 fw1=null;
11 buf1.delete(0,buf1.length()-1); 这个时候我们终于看到了用程序写出来的不用在EditPlus中修改的js文件了。谢天谢地。
3,URIEncoding问题
我发现在我的tomcat上可以跑,但是通过svn下载到我们组另外一个人那里就又出现了乱码。对照一下发现跟程序没有问题,这次还好有些经验,想到了是URIEncoding编码的问题。
终于全部问题解决了。
posted on 2006-04-08 22:33
rd2pm 阅读(1742)
评论(0) 编辑 收藏 所属分类:
java language 、
web develop