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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

在JAVA開發(fā)中的中文處理問題及解決辦法

2019-11-18 12:11:40
字體:
供稿:網(wǎng)友

  在應(yīng)用開發(fā)的過程中,總會(huì)碰到一些“難以理解”的系統(tǒng)缺陷和“不易解決”的問
  題。其實(shí),通過認(rèn)真分析,不必購買昂貴的產(chǎn)品依然可以解決多數(shù)問題。
    ■JDBC ODBC Bridge的Bug及其解決方法
    在編寫一數(shù)據(jù)庫治理程序時(shí),發(fā)現(xiàn)JDBC-ODBC Bridge存在不易發(fā)現(xiàn)的Bug。在向數(shù)據(jù)
  表插入數(shù)據(jù)時(shí),假如為英文字符,存儲(chǔ)內(nèi)容完全正確,假如存入中文字符,部分?jǐn)?shù)據(jù)庫
  只能存儲(chǔ)前七八個(gè)中文字符,其他內(nèi)容被截去,導(dǎo)致存儲(chǔ)內(nèi)容的不完整(有些數(shù)據(jù)庫不
  存在這個(gè)問題,如Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge還存在無法建表的Bug
  )。
    對于廣大需要存儲(chǔ)中文信息的java程序員來說,這可是一個(gè)不好的消息。要么改用
  其他語言編程,要么選擇其他價(jià)格昂貴的數(shù)據(jù)庫產(chǎn)品。“一次編寫,到處運(yùn)行”的目標(biāo)
  ,也大打折扣。能不能采用變通的方法,將中文信息進(jìn)行處理后再存儲(chǔ)來解決這個(gè)問題
  呢?答案是肯定的。
    解決問題的具體思路、方法
    Java采用Unicode碼編碼方式,中英文字符均采用16bit存儲(chǔ)。既然存儲(chǔ)英文信息是
  正確的,根據(jù)一定規(guī)則,將中文信息轉(zhuǎn)換成英文信息后存儲(chǔ),自然不會(huì)出現(xiàn)截尾現(xiàn)象。
  讀取信息時(shí)再進(jìn)行逆向操作,將英文信息還原成中文信息即可。由GB2312編碼規(guī)則可知
  ,漢字一般為二個(gè)高位為1的ASCII碼,在轉(zhuǎn)換時(shí)將一個(gè)漢字的二個(gè)高位1去掉,還原時(shí)再
  將二個(gè)高位1加上。為了處理含有英文字符的中文字串,對英文字符則需要加上一個(gè)Byt
  e 0標(biāo)記。以下提供的兩個(gè)公用靜態(tài)方法,可加入任何一個(gè)類中使用。
    將中英文字串轉(zhuǎn)換成純英文字串
    public static String toTureAsciiStr(String str){
    StringBuffer sb = new StringBuffer();
    byte[] BT = str.getBytes();
    for(int i =0 ;i〈bt.length;i++){
    if(bt[i]〈0){
    //是漢字去高位1
    sb.append((char)(bt[i]&&0x7f));
     }else{//是英文字符 補(bǔ)0作記錄
    sb.append((char)0);
    sb.append((char)bt[i]);
     }
     }
    return sb.toString();
    }
    將經(jīng)轉(zhuǎn)換的字串還原
    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;
    }
    上例在實(shí)際編程中效果很好,只是存儲(chǔ)的中文信息需要經(jīng)過同樣處理,才能被其他
  系統(tǒng)使用。而且假如中文字串出現(xiàn)英文字符,實(shí)際上增加了額外的存儲(chǔ)空間。
    ■Solaris下Servlet編程的中文問題及解決辦法
    在使用Java開發(fā)Internet上的一個(gè)應(yīng)用系統(tǒng)時(shí),發(fā)現(xiàn)在Windows下調(diào)試完全正常的S
  ervlet,上傳到Solaris 服務(wù)器上,運(yùn)行卻出現(xiàn)故障——返回的網(wǎng)頁不能顯示中文,應(yīng)
  為中文的信息全為亂碼;用中文信息做要害字,不能正確檢索數(shù)據(jù)庫。后來采用加入檢
  查代碼等方法探知故障原因如下:
    顯示亂碼主要是因?yàn)橥ㄟ^類 HttpServletResponse提供的方法setContentType 無法
  改變返回給客戶的數(shù)據(jù)的編碼方式,正確的編碼方式應(yīng)為GB2312或者GBK,而事實(shí)上為缺
  省的ISO8859-1。無法檢索中文信息則是因?yàn)椋蛻籼峤坏闹形男畔⒔?jīng)瀏覽器編碼到達(dá)服
  務(wù)器后,Servlet無法將其正確解碼。
    舉例說明顯示亂碼解決方法
    Servlet 一般通常做法如下:
    public class ZldTestServlet extends HttpServlet {
    public void doGet (HttpServletRequest request,HttpServletResponse respon
  se)throws ServletException, IOException{
    //在使用 Writer向?yàn)g覽器返回?cái)?shù)據(jù)前,設(shè)置 content-type header ,在這里設(shè)置
  相應(yīng)的字符集gb2312
    response.setContentType("text/Html;charset=gb2312");
    PRintWriter out = response.getWriter(); //*
    // 正式返回?cái)?shù)據(jù)
    out.println("〈html〉〈head〉〈title〉Servlet test〈/title〉〈/head〉" )
  ;
    out.println("這是一個(gè)測試頁!");
    out.println("〈/body〉〈/html〉");
    out.close();
    }
     ...
    }
    解決頁面顯示亂碼問題,需將*處代碼換成如下內(nèi)容:
    PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOut
  putStream(),"gb2312"));
    Solaris中文信息檢索問題的解決
    瀏覽器利用表單向服務(wù)器提交信息時(shí),一般采用x-www-form-urlencoded 的MIME格
  式對數(shù)據(jù)進(jìn)行編碼。假如使用get方法,參數(shù)名稱和參數(shù)值經(jīng)編碼后附加在URL后,在Ja
  va中稱作查詢串(query string)。
    在Servlet程序中,假如采用ServletRequest的方法getParameter取得參數(shù)值,在S
  olaris環(huán)境下,對漢字卻不能正確解碼。因而無法正確檢索數(shù)據(jù)庫。
    在Java 1.2的包——java.net中提供了URLEncode和URLDecode類。類URLEncode提供
  了按x-www-form-urlencoded格式對給定串進(jìn)行轉(zhuǎn)換的方法。類URLEncode則提供了逆方
  法。
    在編寫某網(wǎng)上114查詢的Servlet時(shí),采用先取得查詢串,再利用類URLDecode解碼,
  再從解碼后的串中取得參數(shù),很好地解決了Solrais環(huán)境下,中文信息檢索的問題。  在應(yīng)用開發(fā)的過程中,總會(huì)碰到一些“難以理解”的系統(tǒng)缺陷和“不易解決”的問
  題。其實(shí),通過認(rèn)真分析,不必購買昂貴的產(chǎn)品依然可以解決多數(shù)問題。
    ■JDBC ODBC Bridge的Bug及其解決方法
    在編寫一數(shù)據(jù)庫治理程序時(shí),發(fā)現(xiàn)JDBC-ODBC Bridge存在不易發(fā)現(xiàn)的Bug。在向數(shù)據(jù)
  表插入數(shù)據(jù)時(shí),假如為英文字符,存儲(chǔ)內(nèi)容完全正確,假如存入中文字符,部分?jǐn)?shù)據(jù)庫
  只能存儲(chǔ)前七八個(gè)中文字符,其他內(nèi)容被截去,導(dǎo)致存儲(chǔ)內(nèi)容的不完整(有些數(shù)據(jù)庫不
  存在這個(gè)問題,如Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge還存在無法建表的Bug
  )。
    對于廣大需要存儲(chǔ)中文信息的Java程序員來說,這可是一個(gè)不好的消息。要么改用
  其他語言編程,要么選擇其他價(jià)格昂貴的數(shù)據(jù)庫產(chǎn)品。“一次編寫,到處運(yùn)行”的目標(biāo)
  ,也大打折扣。能不能采用變通的方法,將中文信息進(jìn)行處理后再存儲(chǔ)來解決這個(gè)問題
  呢?答案是肯定的。
    解決問題的具體思路、方法
    Java采用Unicode碼編碼方式,中英文字符均采用16bit存儲(chǔ)。既然存儲(chǔ)英文信息是
  正確的,根據(jù)一定規(guī)則,將中文信息轉(zhuǎn)換成英文信息后存儲(chǔ),自然不會(huì)出現(xiàn)截尾現(xiàn)象。
  讀取信息時(shí)再進(jìn)行逆向操作,將英文信息還原成中文信息即可。由GB2312編碼規(guī)則可知
  ,漢字一般為二個(gè)高位為1的ASCII碼,在轉(zhuǎn)換時(shí)將一個(gè)漢字的二個(gè)高位1去掉,還原時(shí)再
  將二個(gè)高位1加上。為了處理含有英文字符的中文字串,對英文字符則需要加上一個(gè)Byt
  e 0標(biāo)記。以下提供的兩個(gè)公用靜態(tài)方法,可加入任何一個(gè)類中使用。
    將中英文字串轉(zhuǎn)換成純英文字串
    public static String toTureAsciiStr(String str){
    StringBuffer sb = new StringBuffer();
    byte[] bt = str.getBytes();
    for(int i =0 ;i〈bt.length;i++){
    if(bt[i]〈0){
    //是漢字去高位1
    sb.append((char)(bt[i]&&0x7f));
     }else{//是英文字符 補(bǔ)0作記錄
    sb.append((char)0);
    sb.append((char)bt[i]);
     }
     }
    return sb.toString();
    }
    將經(jīng)轉(zhuǎn)換的字串還原
    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;
    }
    上例在實(shí)際編程中效果很好,只是存儲(chǔ)的中文信息需要經(jīng)過同樣處理,才能被其他
  系統(tǒng)使用。而且假如中文字串出現(xiàn)英文字符,實(shí)際上增加了額外的存儲(chǔ)空間。
    ■Solaris下Servlet編程的中文問題及解決辦法
    在使用Java開發(fā)Internet上的一個(gè)應(yīng)用系統(tǒng)時(shí),發(fā)現(xiàn)在Windows下調(diào)試完全正常的S
  ervlet,上傳到Solaris 服務(wù)器上,運(yùn)行卻出現(xiàn)故障——返回的網(wǎng)頁不能顯示中文,應(yīng)
  為中文的信息全為亂碼;用中文信息做要害字,不能正確檢索數(shù)據(jù)庫。后來采用加入檢
  查代碼等方法探知故障原因如下:
    顯示亂碼主要是因?yàn)橥?br>
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 巨鹿县| 井冈山市| 盐边县| 南丰县| 大姚县| 普安县| 开平市| 邢台县| 娄底市| 惠水县| 乌海市| 永康市| 桂东县| 江津市| 巍山| 乌鲁木齐市| 万州区| 定襄县| 鄂伦春自治旗| 巴林左旗| 靖州| 耒阳市| 利辛县| 塘沽区| 蕲春县| 女性| 蒲江县| 宝坻区| 黎城县| 盐边县| 定边县| 开江县| 潜江市| 望奎县| 乌拉特后旗| 长武县| 天台县| 阳江市| 永年县| 永年县| 鸡东县|