11i環境,通常來講jsp是重啓apache後自動編譯的,可是由於某些環境設置,須要手動編譯jsp。html
11i的編譯路徑:$JTF_TOP/admin/scripts/ojspCompile.pljava
編譯命令:perl $JTF_TOP/admin/scripts/ojspCompile.pl --compile -p 16 -s xxx.jsp數據庫
一個簡單的jsp文件test1.jsp,文件編碼格式GB2312,代碼以下:
apache
<%@page language="java" contentType="text/html; charset=gb2312"%> <html> <body> <font size="+2" color="#000000">測試亂碼</font> </body> </html>
上傳至服務器$OA_HTML/SSO_OA 目錄下,用ojspCompile編譯,編譯經過的話,服務器$OAD_TOP/_pages/_oa__html/_sso__oa/ 下生成兩個class文件:_test1.class 和 _test1$__jsp_StaticText.class 。瀏覽器
將class下載到本地,反編譯,發現裏面中文是亂碼,這也就能解釋爲何瀏覽器訪問是亂碼了。服務器
因而懷疑是編譯器的問題,有查到資料說編譯器默認編譯編碼是IS0-8859-1,因而就在考慮如何修改編譯編碼。jsp
將$JTF_TOP/admin/scripts/ojspCompile.pl下載到本地,打開後搜索「javac」看到這麼一段:ide
sub javac_internal { my $osname = undef; chop ($osname = `uname -s`); my ($java_ver) = &myrun(30, "$java -version 2>&1"); chomp($java_ver); if($java_ver =~/1.5/) { if (($osname eq "AIX") || ($osname eq "OSF1")) { return 'exec javac -nowarn' } elsif ($ISWINNT) { return 'javac -J-client -nowarn' } else { return 'exec javac -J-client -nowarn' } } elsif ($ISWINNT) { return 'javac -nowarn' } else { return 'exec javac -nowarn' } }
javac命令是能夠指定編碼的,在javac命令後加上 -encoding GB2312 便可。測試
由於我當前使用的11i環境包括數據庫相關編碼都是GB2312的, 因此我把這裏改爲了GB2312編碼,固然,不一樣環境也能夠改爲utf-8。編碼
修改後的代碼:
sub javac_internal { my $osname = undef; chop ($osname = `uname -s`); my ($java_ver) = &myrun(30, "$java -version 2>&1"); chomp($java_ver); if($java_ver =~/1.5/) { if (($osname eq "AIX") || ($osname eq "OSF1")) #old { return 'exec javac -nowarn' } { return 'exec javac -nowarn -encoding GB2312' } elsif ($ISWINNT) { return 'javac -J-client -nowarn' } else { return 'exec javac -J-client -nowarn' } } elsif ($ISWINNT) { return 'javac -nowarn' } #old else { return 'exec javac -nowarn' } else { return 'exec javac -nowarn -encoding GB2312' } }
保證jsp文件的編碼與當前設置的編碼相同,而後從新執行ojspCompile編譯。
大功告成,反編譯後的class內中文正常顯示。
R12環境的ojspCompile路徑:$FND_TOP/patch/115/bin ,這個版本里已經默認添加編譯字符集爲utf-8。