程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> solaris上開發J2EE應用中文問題的解決

solaris上開發J2EE應用中文問題的解決

編輯:J2EE
關於JSP和J2EE的中文問題和處理方法,網上已經有很多文章。一般在中文內核的操作系統(如中文NT,Windows2000)上,該問題不是很突出,而在其他一些系統(如Linux,solaris)中就比較明顯了。近日在solaris上開發一個J2EE的應用系統,環境是solaris 2.7+miniJ2EE+MySQL。系統在Windows和Linux下均沒有出現中文處理的問題,但部署到solaris上面後所有中文顯示為?。 後來經過分析,發現原因出在系統編碼上。由於安裝solaris時默認的系統編碼為ASCII,因此以默認的系統編碼處理字符串時漢字高位信息丟失。下面一段簡單的JSP程序說明了這個問題: <%@ page contentType="text/html;charset=gb2312"%><% String str=request.getParameter("i"); //byte[] b=str.getBytes("iso-8859-1"); byte[] b=str.getBytes(); out.println(new String(b,"gb2312")); %>在浏覽器中輸入foo.JSP?i=中文,結果顯示為??。如果將byte[] b=str.getBytes();換成上面注釋掉的byte[] b=str.getBytes("iso-8859-1");,則正常顯示出“中文”二字。查閱了MySQL JDBC的驅動程序,問題相同。 考慮解決的方法有兩個,一個是修改JDBC驅動程序,另一個是將漢字編碼成7位,從實現方便的角度選擇了後者。不過後者的缺點是字符串長度增加,並且無法直接通過sql工具來修改數據庫了。網上有一種漢字編碼的方法,是將漢字高位去1,英文則補一個0表示。這種方法有缺陷,因為特定的漢字編碼後會出現“'”等SQL語句中有歧義的字符,導致sql失敗。我摘取了miniJ2EE中uniString的編碼方法,該方法將字節表示為其16進制編碼,下面是源代碼: public String encode() { try { StringBuffer sb=new StringBuffer(); byte[] bytes=m_enc.compareTo("")==0?m_str.getBytes():m_str.getBytes(m_enc); for(int i =0;i>4)&0xF,16); sb.append(ch); ch=Character.forDigit(bytes[i]&0xF,16); sb.append(ch); } return sb.toString(); } catch(Java.io.UnsupportedEncodingException e) { throw new RuntimeException("Unsupported encoding type."); } } public void decode(String encodestr) { StringBuffer sb=new StringBuffer(); int i=0; while(i!=encodestr.length()) { sb.append((char)Integer.parseInt(encodestr.substring(i,i+2),16)); i+=2; } m_str=new uniString(sb.toString(),"iso-8859-1").cvt(m_enc); } 使用編碼後,問題解決。 另外提一下,miniJ2EE最新版本中提供了一個uniString類,解決了在所有操作系統上的中文問題。使用uniString對象,無需關心字符串本身編碼,使用時只要調用函數來獲得需要的編碼即可,如在JSP裡調用uniString.gb()即可以以gb2312輸出字符串,在數據庫存儲時調用uniString.iso()即可以以iso-8859-1編碼輸出字符串,無論在中文內核還是英文內核的操作系統上均通用。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved