国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java中文相關技術

2019-11-18 13:18:56
字體:
來源:轉載
供稿:網友

  在應用開發的過程中,總會碰到一些“難以理解”的系統缺陷和“不易解決”的問題。其實,通過認真分析,不必購買昂貴的產品依然可以解決多數問題。
  ■JDBC ODBC Bridge的Bug及其解決方法
  在編寫一數據庫治理程序時,發現JDBC-ODBC Bridge存在不易發現的Bug。在向數據表插入數據時,假如為英文字符,存儲內容完全正確,假如存入中文字符,部分數據庫只能存儲前七八個中文字符,其他內容被截去,導致存儲內容的不完整(有些數據庫不存在這個問題,如Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge還存在無法建表的Bug)。
  對于廣大需要存儲中文信息的java程序員來說,這可是一個不好的消息。要么改用其他語言編程,要么選擇其他價格昂貴的數據庫產品。“一次編寫,到處運行”的目標,也大打折扣。能不能采用變通的方法,將中文信息進行處理后再存儲來解決這個問題呢?答案是肯定的。
  解決問題的具體思路、方法
  Java采用Unicode碼編碼方式,中英文字符均采用16bit存儲。既然存儲英文信息是正確的,根據一定規則,將中文信息轉換成英文信息后存儲,自然不會出現截尾現象。讀取信息時再進行逆向操作,將英文信息還原成中文信息即可。由GB2312編碼規則可知,漢字一般為二個高位為1的ASCII碼,在轉換時將一個漢字的二個高位1去掉,還原時再將二個高位1加上。為了處理含有英文字符的中文字串,對英文字符則需要加上一個Byte 0標記。以下提供的兩個公用靜態方法,可加入任何一個類中使用。
  將中英文字串轉換成純英文字串
  public static String toTureAsciiStr(String str){
  StringBuffer sb = new StringBuffer();
  byte[] BT = str.getBytes();
  for(int i =0 i〈btelse{//是英文字符 補0作記錄
  sb.append((char)0);
  sb.append((char)bt[i]);
  }
  }
  return sb.toString();
  }
  將經轉換的字串還原
  public static String unToTrueAsciiStr(String str){
  byte[] bt = str.getBytes();
  int i,l=0,length = bt.length,j=0;
  for(i = 0;i〈length;i++){
  if(bt[i] == 0){
  l++;
  }
  }
  byte []bt2 = new byte[length-l];
  for(i =0 i〈length;i++){
  if(bt[i] == 0){
  i++;
  bt2[j] = bt[i];
  }else{
  bt2[j] = (byte)(bt[i]0x80);
  }
  j++;
  }
  String tt = new String(bt2);
  return tt;
  }
  上例在實際編程中效果很好,只是存儲的中文信息需要經過同樣處理,才能被其他系統使用。而且假如中文字串出現英文字符,實際上增加了額外的存儲空間。
  ■Solaris下Servlet編程的中文問題及解決辦法
  在使用Java開發Internet上的一個應用系統時,發現在Windows下調試完全正常的Servlet,上傳到Solaris 服務器上,運行卻出現故障——返回的網頁不能顯示中文,應為中文的信息全為亂碼;用中文信息做要害字,不能正確檢索數據庫。后來采用加入檢查代碼等方法探知故障原因如下:
  顯示亂碼主要是因為通過類 HttpServletResponse提供的方法setContentType 無法改變返回給客戶的數據的編碼方式,正確的編碼方式應為GB2312或者GBK,而事實上為缺省的ISO8859-1。無法檢索中文信息則是因為,客戶提交的中文信息經瀏覽器編碼到達服務器后,Servlet無法將其正確解碼。
  舉例說明顯示亂碼解決方法
  Servlet 一般通常做法如下:
  public class ZldTestServlet extends HttpServlet {
  public void doGet (HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
  //在使用 Writer向瀏覽器返回數據前,設置 content-type header ,在這里設置相應的字符集gb2312
  response.setContentType("text/Html;charset=gb2312");
  PRintWriter out = response.getWriter(); //*
  // 正式返回數據
  out.println("〈html〉〈head〉〈title〉Servlet test〈/title〉〈/head〉" );
  out.println("這是一個測試頁!");
  out.println("〈/body〉〈/html〉");
  out.close();
  }
  ...
  }
  解決頁面顯示亂碼問題,需將*處代碼換成如下內容:
  PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(),"gb2312"));
  Solaris中文信息檢索問題的解決
  瀏覽器利用表單向服務器提交信息時,一般采用x-www-form-urlencoded 的MIME格式對數據進行編碼。假如使用get方法,參數名稱和參數值經編碼后附加在URL后,在Java中稱作查詢串(query string)。
  在Servlet程序中,假如采用ServletRequest的方法getParameter取得參數值,在Solaris環境下,對漢字卻不能正確解碼。因而無法正確檢索數據庫。
  在Java 1.2的包——java.net中提供了URLEncode和URLDecode類。類URLEncode提供了按x-www-form-urlencoded格式對給定串進行轉換的方法。類URLEncode則提供了逆方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泸西县| 库伦旗| 水城县| 桓台县| 台湾省| 嘉峪关市| 调兵山市| 湘阴县| 济宁市| 仙桃市| 元谋县| 横山县| 蛟河市| 黑水县| 宣威市| 沙河市| 茌平县| 沙洋县| 福贡县| 吴旗县| 宝鸡市| 达日县| 仲巴县| 兴宁市| 获嘉县| 永嘉县| 滦南县| 黑山县| 威信县| 克拉玛依市| 新密市| 静海县| 阜新市| 通河县| 额敏县| 林口县| 历史| 长顺县| 娄底市| 鄂伦春自治旗| 芦溪县|