posts - 23,comments - 66,trackbacks - 0
          項(xiàng)目為了解決GBK字符不夠用的問題,主要是特殊字符的問題,決定趕追國際潮流采用UTF-8作為我們統(tǒng)一的編碼方式。于是這里邊雖然支持的編碼增加了,但是也出現(xiàn)了一系列的問題。
          1,模板的搭配。
          由于使用了Struts的tiles標(biāo)簽來進(jìn)行網(wǎng)頁布局,所以外層一定要用utf-8,原來實(shí)驗(yàn)室的經(jīng)驗(yàn)是在內(nèi)層采用gbk,并且別證明是夠用的,但是我們決定在這個(gè)項(xiàng)目里統(tǒng)一使用utf-8,當(dāng)初也沒想到后來會(huì)出現(xiàn)問題。
          這樣首先出現(xiàn)的問題是jsp文件的編碼問題,原來使用GBK編碼的一些文件,在編碼突然變化到utf-8的時(shí)候顯得很不適應(yīng),后來終于在Eclipse,EditPlus的幫助下完成了編碼的轉(zhuǎn)換,在頁面里邊能夠很好的顯示出中文了。
          2,js文件問題。
          由于系統(tǒng)使用了很多編碼轉(zhuǎn)換的js,所以使用了簡(jiǎn)單的jsp來根據(jù)數(shù)據(jù)庫中的編碼來生成js。比如報(bào)名過程中要求學(xué)員選擇項(xiàng)目和班次,采用下拉菜單的形式就比較簡(jiǎn)單。但是這樣就出現(xiàn)了問題,按照不設(shè)定編碼的方式來生成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);


          然后構(gòu)造buf1也就是js文件的內(nèi)容,并使用下列代碼完成寫的過程:
          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>
          試圖引入的時(shí)候發(fā)現(xiàn)引入不進(jìn)來。

          剛開始根本想不到是utf-8編碼的問題,反反復(fù)復(fù)找函數(shù)的問題,后來確信絕對(duì)沒有問題才開始想別的地方,終于想到字符編碼問題。
          先是用EditPlus來把xm.js文件轉(zhuǎn)換成utf-8格式,然后奇跡般的發(fā)現(xiàn)居然work了。
          后來數(shù)據(jù)庫不斷的更換,每次都要求重新生成js文件,這樣就搞得我們每次都要用EditPlus轉(zhuǎn)換一遍,這樣很不爽。沒有辦法了必須要通過程序的途徑來形成能夠直接使用的js文件。
          那么首先就看代碼各個(gè)環(huán)節(jié)中涉及到編碼的地方有哪里,結(jié)果發(fā)現(xiàn)在StringBuffer里邊可以由String進(jìn)行編碼設(shè)定,先試驗(yàn)這個(gè)。我分別在
          fw1.write(new?String(buf1.toString().getBytes("UTF-8"),"UTF-8"));
          這句話里邊試過各種編碼,從
          ISO-8859-1到UTF-8,甚至UTF-16,前后怎么換都出不來。
          后來我只好去查UTF-8的編碼。發(fā)現(xiàn)了一個(gè)講的特別仔細(xì)的文章。后來,我記得原來在轉(zhuǎn)換編碼的時(shí)候也用過UltreaEdit,而且比EditPlus編碼好像要復(fù)雜,于是用UltreaEdit打開文件,另存,果然發(fā)現(xiàn)有多種編碼形式。經(jīng)過試驗(yàn)采用utf-8 no bom的形式就可以被網(wǎng)頁正確引入。于是又去查這個(gè)bom,最后也沒有找到在java里邊的名稱。搞得我心灰意冷。
          這時(shí),我又查了一下FileWriter發(fā)現(xiàn)提供一個(gè)getEncoding()的方法,于是把第一段代碼中注釋的一段去掉打印出來發(fā)現(xiàn)是GBK。返回頭去看jsp的編碼,這個(gè)居然沒有改成utf-8,原來是這個(gè)問題,馬上改過來。可是改過來再去試還是不對(duì)。打印出來仍然是GBK,看來不是JSp文件的問題。這個(gè)問題還真麻煩。
          查了一下文件輸出流的幾個(gè)類之間的繼承關(guān)系,發(fā)現(xiàn)在指定輸出文件的時(shí)候也可以用OutputStreamWriter這個(gè)基類來代替FileWriter,可以在OutputStreamWriter里邊設(shè)定編碼。
          修改過之后變成下邊這個(gè)樣子:
          ?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?//.中間構(gòu)造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);
          這個(gè)時(shí)候我們終于看到了用程序?qū)懗鰜淼牟挥迷贓ditPlus中修改的js文件了。謝天謝地。
          3,URIEncoding問題
          我發(fā)現(xiàn)在我的tomcat上可以跑,但是通過svn下載到我們組另外一個(gè)人那里就又出現(xiàn)了亂碼。對(duì)照一下發(fā)現(xiàn)跟程序沒有問題,這次還好有些經(jīng)驗(yàn),想到了是URIEncoding編碼的問題。

          終于全部問題解決了。
          posted on 2006-04-08 22:33 rd2pm 閱讀(1756) 評(píng)論(0)  編輯  收藏 所屬分類: java languageweb develop

          主站蜘蛛池模板: 苗栗市| 弥勒县| 天镇县| 南陵县| 临西县| 鸡西市| 双流县| 若尔盖县| 阿勒泰市| 逊克县| 康定县| 镇原县| 南郑县| 淅川县| 司法| 沐川县| 靖江市| 城步| 韶关市| 冀州市| 远安县| 新乐市| 金华市| 奈曼旗| 乐安县| 叙永县| 久治县| 木里| 五寨县| 汤原县| 临邑县| 武平县| 东明县| 郸城县| 高邮市| 囊谦县| 荔浦县| 金乡县| 泗阳县| 高雄县| 吉首市|