亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

關于Java中文問題的幾條分析原則(推薦)

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

  盡管關于java中文問題的討論已經相當多了,但由于Java的相關技術標準繁多,面向Java的Web服務器、應用服務器以及JDBC數據庫驅動等都沒有官方的標準,所以Java應用在處理中文時所存在的問題不僅沒有消失而且隨著所選用的服務器、驅動程序以及運行環境等因素的不同而變化。那么我們如何從眾多現象中找出問題所在,并進行分析和解決呢?與大部分的討論不同,本文將主要從如何猜測、發現和檢查問題的角度給出建議,幫助開發人員找出可能引起問題的各種源頭,從而更好地解決Java的中文問題。
  引言
  
  盡管對于Java中文處理問題的討論已不乏其數,但由于Java技術涉及內容廣(J2EE包含了十幾種相關技術),技術供給商繁多,面向Java的Web服務器、應用服務器以及JDBC數據庫驅動等都沒有官方的標準,所以Java應用在處理中文過程中出了存在固有的問題外也存在隨著選用的服務器,驅動程序的不同而帶來的Java中文問題的多變性,增加了問題的復雜度。那么,我們如何在這么紛繁的現象中找到問題的癥結呢?
  
  Java中文問題的一般解決辦法
  
  事實上,Java的中文問題都是由于Java應用所采用的缺省編碼格式與目標或者應用所要讀入字符的編碼格式不同而造成的(具體參見文獻1)。對于如何解決Java的中文問題,通常有四種方法:
  
  1) 選擇JDK的中文本地化版本。盡管Java2 JDK的中文本地化版本(http://java.sun.com/PRodUCts/jdk/1.2/chinesejdk.Html)并不是一個官方的版本,Sun公司也沒有承諾會對該本地化版本進行升級,但其仍不失為一個Java中文問題的解決方案。
  
  2) 選擇合適的編譯參數。對于Java的國際版本來講,我們也可以在編譯Java應用的時候通過指定確定的編碼機制來實現其編譯結果對中文的支持。例如,對于需要支持繁體中文和簡體中文應用可以通過javac -encoding big5 sourcefile.java 和javac -encoding gb2312 sourcefile.java來編譯源程序。
  
  3) 通過編程的方式實現字符編碼的轉換代碼。通過編程的方式來解決Java的中文問題,已經成為了一種較為普遍的做法。下面就是一種最常見的字符編碼轉換函數,其將字符的編碼格式轉換為中文Windows系統的GBK編碼形式。
  
  
  public static String toChinese(String strvalue)
   {
   try{
   if(strvalue==null)
   return null;
   else
   {
   strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
   return strvalue;
   }
   }catch(Exception e){
   return null;
   }
   }
  
  
  
  
  4) 定義字符輸出集。對于jsp應用,我們可以通過<%@ page contentType="text/html; charset=GBK" %>或<%@ page contentType="text/html; charset=GB2312" %>來定義JSP頁面的字符輸出集。當然,我們也可以通過HTML的標記來定義字符的輸出集。
  
  存在的問題
  
  根據方法實現的方式,我們可以將以上四種方法分為兩類,一類是通過利用某些標準或者規則來實現的方法,上面的1)、2)、4)都屬于此類;一類是通過針對性的編程來實現的方法,上面所提的方法3)就屬于此類。
  
  由于方法1),2),4)是具有規范性的一類方法,所以方法比較簡單,解決方案也不具備較大的針對性,較為通用,例如我們可以采用方法2)的編譯方式通過編譯Java源文件來實現內碼的預置,而無需考慮源碼到底有哪些部分出現了Java的中文處理問題,諸如輸出亂碼等等。
  
  但是,正由于這些方法不具備針對性,解決問題的方法過于統一,所以在某些情況下,它們并不能徹底地解決Java的中文問題。舉一個非經常見的例子。在通常情況下,用戶的Java應用往往需要與其它Java應用接口進行交互,例如通過某種版本的JDBC訪問數據庫。由于JDBC的驅動所支持的編碼隨著提供商乃至版本的不同而不同,所以假如在數據庫的輸入輸出過程中出現中文不能正確處理問題時,我們需要在數據的輸入和輸出過程做兩次正好相反的編碼轉換,這對于方法1),2),4)來說,往往是無法解決的。當然,對于方法2,我們也可以通過采用一些技巧使來滿足上面的情況,一個最有效的辦法就是盡量將Java應用的各個部分組件化。例如我們可以通過將數據庫的讀入和輸出代碼分解在不同的源文件上來實現分別編譯,從而滿足不同的字符編碼要求。但是通常的程序設計都不太可能滿足這種要求,因為這種程序的劃分結果很可能是不合理的。例如,我們將數據庫的讀出和寫入方法封裝到一個類中是比較合適的一種設計,但假如將該類的這兩個方法分別實現在兩個文件里則變得非常不合理。因此對于1),2),4)方法來說,雖然實現比較簡單,但卻具有一些無法克服的缺點。這也是那些實現起來相對復雜的編程方法得以流行的原因。
  
  相對于方法1),2),4)來說,方法3)具有更好的針對性和靈活性。程序可以根據不同的情況做出靈活的處理,在任何需要的地方進行字符的編碼轉換,但是該方法的特點也對軟件的開發人員提出了更高要求--必須能夠準確的捕捉到有可能發生中文處理問題的地方,并做出正確的判定和處理。
  
  分析的原則
  
  總的說來,所有解決Java中文處理的方法都不是很復雜。相反的是,由于Java技術非凡是J2EE技術涉及的內容繁多,各種Web服務器、應用服務器以及JDBC數據庫驅動等參差不齊,所以如何正確而及時的發現應用的中文處理問題則變得相對復雜的多。那么我們如何來發現這些問題呢?
  
  通常,Java處理中文時所產生的問題都是由于用戶的Java應用所采用的缺省編碼格式與目標或者應用所要讀入字符的編碼格式不同而造成的,而引起這些不同的一個主要原因就是用戶的Java應用與其它應用進行了編碼格式不匹配的數據交換(包括直接或間接的數據輸入、輸出)。所以,為了及時發現問題,我們可以由這一點入手,根據以下的原則對應用進行分析:
  
  注重字符變量情況。由于變量的字符編碼形式較為隱蔽,多次變量間數值的改變和運算可能會引起字符集的改變;在變量與頁面所提交數據的各種操作中,較輕易發生不同編碼格式字符進行運算的情況。
  注重任何形式的字符讀入與輸出。之所以要提到任何形式,是因為Java應用大多數都是作為網絡應用開發的,所以與其它語言的應用相比,Java應用需要面對網絡世界各種各樣的字符數據交換形式。例如各種表單的數據提交,URL形式的數據讀入,經過加密運算的字符數據交換,網頁控件選擇結果的輸入,控件內容的的顯示(如List控件)等等。
  小心使用第三方的組件和應用。由于第三方組件和應用的實現是非透明的,所以一般情況下,我們很難判定這些組件或驅動的缺省編碼格式是什么,也無法對其進行控制。因此,在使用它們所提供的接口函數進行數據交換的時候要非凡注重,假如確實出現中文無法正確處理情況,應首先檢查我們自己的代碼并調整相關代碼以適應這些接口,因為這些組件或者應用基本上不會提供調整編碼機制的接口。必要時,我們可能需要采用其它可替換的組件或者應用。
  注重被請求對象所含有的數據輸入與輸出。這是非常隱蔽的一類情況,當我們的應用以對象的方式(例如序列化的對象)進行交互時,假如這個對象內部含有字符數據的處理過程,或者含有某些數據的輸入、輸出,甚至是拋出一段用中文注解的異常,都可能出現中文無法正確顯示等問題。由于這些行為往往被封裝在對象中,所以我們在編寫程序時,很輕易忽略這種可能情況。并且這種情況帶有一定的不可預見性,例如我們可能不清楚這個對象會在什么時候拋出什么樣的異常,所以這時我們就需要做一定的測試工作。
  注重數據庫的數據訪問過程。Java通過JDBC與數據庫建立連接。對于JDBC驅動程序來說,由于目前大部分的JDBC驅動程序并不是針對中文系統而設計的(中文數據大都采用ISO-8859-1編碼方式),所以一般情況下在數據讀寫過程中往往都需要字符編碼的轉化。但是我們仍建議用戶在使用這些JDBC驅動時,仔細閱讀它的說明。假如確實無法弄清JDBC字符數據的編碼到底是什么,我們的建議是做一些必要的測試。例如下面是一組在簡體中文Win2000平臺下,采用Weblogic 6.0所提供的JDBC驅動從MS SQL Server2000中正確讀入中文字符的代碼(例子中進行了字符運算):
  
  ...
  Class.forName("weblogic.jdbc.MSSQLserver4.Driver").newInstance();
   conn = myDriver.connect("jdbc:weblogic:mssqlserver4", props);
   conn.setCatalog("labmanager");
   Statement st = conn.createStatement();
  //execute a query
  String testStr;
  String testTempStr = new String() ;
   testStr = new String(testTempStr.getBytes("ISO-8859-1"));//編碼轉化
  DatabaseMetaData DBMetaData =conn.getMetaData();
  ResultSet rs = DBMetaData.getTables(null, null,null,new String[]{"TABLE"} );
  while (rs.next()){
  for(int j=1; j<=rs.getMetaData().getColumnCount(); j++){
  testStr = testStr +String(rs.getObject(j).toString().getBytes("ISO-8859-1"));
  }
  }
  
  
  
  
  然而,需要注重的是,不同的JDBC驅動對相同的數據庫的支持并不同,而同一類JDBC驅動對不同的數據庫的支持也不相同,也就是說我們的字符轉化代碼在JDBC驅動改變甚至是版本變化情況下都有可能無法正確工作。例如對于上面的例子,在同樣的環境下改用i-net 的Una 2000 Driver Version 2.03 for MS SQL Serve

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情乱人伦| 中文字幕亚洲综合久久筱田步美| 91丨九色丨国产在线| 91精品久久久久久久久不口人| 国外成人在线播放| 久久夜色精品亚洲噜噜国产mv| 欧美黄色三级网站| 三级精品视频久久久久| 日韩av在线一区二区| 国产精品亚洲综合天堂夜夜| zzjj国产精品一区二区| 日本一区二区在线免费播放| 中文字幕亚洲欧美一区二区三区| 欧洲成人午夜免费大片| 国产欧亚日韩视频| 久久久久久国产精品三级玉女聊斋| 51色欧美片视频在线观看| 日韩欧美成人精品| 国产色视频一区| 97超级碰碰人国产在线观看| 日本韩国在线不卡| 国产精品久久久久秋霞鲁丝| 亚洲人成在线一二| 亚洲最大av在线| 亚洲精品xxxx| 亚洲免费精彩视频| 中文字幕亚洲一区二区三区五十路| 国产精选久久久久久| 精品久久中文字幕久久av| 国产精品电影在线观看| 亚洲欧美在线免费观看| 精品国产一区二区三区四区在线观看| 久久久久久亚洲| 在线激情影院一区| 欧美成人三级视频网站| 亚洲午夜未满十八勿入免费观看全集| 88xx成人精品| 久久久久久久久国产| 欧美视频中文在线看| 亚洲人成在线电影| 国产精品www色诱视频| 成人激情视频在线播放| 亚洲欧美中文日韩在线| 亚洲精品网站在线播放gif| 欧美日韩在线第一页| 国产免费一区二区三区香蕉精| 成人激情在线观看| 综合国产在线视频| 欧美激情影音先锋| 91精品国产99久久久久久| 中文字幕欧美专区| 欧美成aaa人片免费看| 69国产精品成人在线播放| 久久久久久久久国产精品| 中文字幕亚洲一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲男女自偷自拍图片另类| 久久99国产精品自在自在app| 日韩免费不卡av| 91精品啪aⅴ在线观看国产| 日韩欧美主播在线| 欧美精品久久久久久久| 亚洲天堂影视av| 日韩视频―中文字幕| 日韩高清a**址| 久久艳片www.17c.com| 自拍偷拍亚洲精品| 国产精品自拍小视频| 亚洲国产福利在线| 欧美电影院免费观看| 亚洲另类激情图| 国产欧亚日韩视频| 在线视频一区二区| 久久久久亚洲精品成人网小说| 久久久亚洲欧洲日产国码aⅴ| 国产精品免费看久久久香蕉| 日韩成人激情影院| 在线观看欧美成人| 日韩在线观看免费av| 亚洲黄色在线观看| 国产成人精品av在线| 福利一区视频在线观看| 福利一区视频在线观看| 亚洲精品久久7777777| 久久人人97超碰精品888| 国语自产偷拍精品视频偷| 国产精品啪视频| 欧美香蕉大胸在线视频观看| 国产亚洲视频中文字幕视频| 国产成人小视频在线观看| 亚洲高清福利视频| 日韩成人网免费视频| 欧美—级a级欧美特级ar全黄| 亚洲欧洲黄色网| 在线观看日韩欧美| 亚洲欧洲在线看| 久久久精品久久久久| 日韩精品免费一线在线观看| 亚洲高清福利视频| 精品自拍视频在线观看| 欧美激情亚洲精品| 欧美激情视频网站| 国产日韩欧美综合| 欧美日韩精品国产| 欧美性xxxxx| 亚洲国产日韩欧美在线动漫| 欧美中文字幕在线| 国产亚洲一区二区在线| 精品国产乱码久久久久久天美| 91在线高清视频| 黄色成人av网| 韩国精品美女www爽爽爽视频| 91精品视频大全| 成人春色激情网| 久久精品亚洲精品| 欧美最猛性xxxx| 欧美专区日韩视频| 亚洲аv电影天堂网| 国产拍精品一二三| 国产97在线|日韩| 成人黄色激情网| 国产成人精品一区二区三区| 成人在线中文字幕| 欧美野外wwwxxx| 久精品免费视频| 色综合男人天堂| 精品视频偷偷看在线观看| 精品久久久久久久中文字幕| 久久这里只有精品视频首页| 欧美大秀在线观看| 欧美精品激情在线观看| 九九久久国产精品| 在线播放国产精品| 综合网日日天干夜夜久久| 日本一本a高清免费不卡| 色无极影院亚洲| 97视频在线观看播放| 欧美贵妇videos办公室| 日韩免费视频在线观看| 亚洲91av视频| 日韩欧美成人精品| 国产精品久久久久久久午夜| 色yeye香蕉凹凸一区二区av| 韩国精品久久久999| 国内精品模特av私拍在线观看| 国产日韩精品在线| 91国产精品91| 国产999精品视频| 午夜精品久久久久久99热| 成人免费视频a| 美女精品视频一区| 成人免费观看49www在线观看| 精品国产91久久久| 国产一区深夜福利| 日韩视频免费大全中文字幕| 国产精品久久9| 欧美电影免费观看高清完整| 国产精品美女久久久久av超清| 国产91精品久久久久| 成人欧美一区二区三区黑人孕妇| 亚洲成年人影院在线| 亚洲人成在线观看网站高清| 国产亚洲精品久久久| 亚洲综合av影视|