熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java中文相關技術

2013-11-15 11:41:06  來源: JSP教程 

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

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.