|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包......成绩|中文只管关于Java中文处置成绩的会商已不乏其数,但因为Java手艺触及内容广(J2EE包括了十几种相干手艺),手艺供给商单一,面向Java的Web服务器、使用服务器和JDBC数据库驱动等都没有官方的尺度,以是Java使用在处置中文过程当中出了存在固有的成绩外也存在跟着选用的服务器,驱动程序的分歧而带来的Java中文成绩的多变性,增添了成绩的庞大度。那末,我们怎样在这么纷纷的征象中找到成绩的关键呢?
Java中文成绩的一样平常办理举措
现实上,Java的中文成绩都是因为Java使用所接纳的缺省编码格局与方针大概使用所要读进字符的编码格局分歧而酿成的(详细拜见文献1)。关于怎样办理Java的中文成绩,一般有四种办法:
1)选择JDK的中文当地化版本。只管Java2JDK的中文当地化版本(http://java.sun.com/products/jdk/1.2/chinesejdk.html)并非一个官方的版本,Sun公司也没有答应会对该当地化版本举行晋级,但其仍不掉为一个Java中文成绩的办理计划。
2)选择符合的编译参数。关于Java的国际版原本讲,我们也能够在编译Java使用的时分经由过程指定断定的编码机制来完成其编译了局对中文的撑持。比方,关于必要撑持繁体中文和简体中文使用能够经由过程javac-encodingbig5sourcefile.java和javac-encodinggb2312sourcefile.java来编译源程序。
3)经由过程编程的体例完成字符编码的转换代码。经由过程编程的体例来办理Java的中文成绩,已成了一种较为广泛的做法。上面就是一种最多见的字符编码转换函数,其将字符的编码格局转换为中文Windows体系的GBK编码情势。- publicstaticStringtoChinese(Stringstrvalue){try{if(strvalue==null)returnnull;else{strvalue=newString(strvalue.getBytes("ISO8859_1"),"GBK");returnstrvalue;}}catch(Exceptione){returnnull;}}
复制代码 4)界说字符输入集。关于JSP使用,我们能够经由过程<%@pagecontentType="text/html;charset=GBK"%>或<%@pagecontentType="text/html;charset=GB2312"%>来界说JSP页面的字符输入集。固然,我们也能够经由过程HTML的标志<METAHTTP-EQUIV="Content-Type"CONTENT="text/html;charset=gb2312">来界说字符的输入集。
存在的成绩
依据办法完成的体例,我们能够将以上四种办法分为两类,一类是经由过程使用某些尺度大概划定规矩来完成的办法,下面的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平台下,接纳Weblogic6.0所供应的JDBC驱动从MSSQLServer2000中准确读进中笔墨符的代码(例子中举行了字符运算):
- ...Class.forName("weblogic.jdbc.mssqlserver4.Driver").newInstance();conn=myDriver.connect("jdbc:weblogic:mssqlserver4",props);conn.setCatalog("labmanager");Statementst=conn.createStatement();//executeaqueryStringtestStr;StringtestTempStr=newString();testStr=newString(testTempStr.getBytes("ISO-8859-1"));//编码转化DatabaseMetaDataDBMetaData=conn.getMetaData();ResultSetrs=DBMetaData.getTables(null,null,null,newString[]{"TABLE"});while(rs.next()){for(intj=1;j<=rs.getMetaData().getColumnCount();j++){testStr=testStr+String(rs.getObject(j).toString().getBytes("ISO-8859-1"));}}
复制代码 但是,必要注重的是,分歧的JDBC驱动对不异的数据库的撑持其实不同,而统一类JDBC驱动对分歧的数据库的撑持也不不异,也就是说我们的字符转化代码在JDBC驱动改动乃至是版本变更情形下都有大概没法准确事情。比方关于下面的例子,在一样的情况下改用i-net的Una2000DriverVersion2.03forMSSQLServer时,是没法准确处置中文的。缘故原由很复杂,这个JDBC驱动自己撑持的就是GBK的编码机制,以是基本就不必要做任何的编码转化。
6)需要的测试。因为Java中文成绩的发生跟着Web服务器,扫瞄器,运转情况和开辟工具的分歧都大概产生变更,以是为了更好的制止成绩的产生,我们必需作一些针对性的测试。别的,在我们的确没法经由过程剖析来断定Java的中文处置成绩是不是大概产生的情形下大概没法晓得成绩的产生是因为哪一个环节(是Web服务器,扫瞄器仍是JDBC数据驱动等等)引发的时分,测试事情则变得十分主要。而且我们大概必要较为周全的测试,比方对Web服务器,扫瞄器和JDBC数据驱动等都要做测试,如许有益于我们找出那些埋没在多个环节和谐过程当中所发生的成绩。
结论
现实上,Java中文处置之以是存在成绩,其基本缘故原由是因为被操纵的中笔墨符(变量)的编码格局与方针的编码格局分歧酿成的,一切这些成绩实在都是产生在字符的读进、输入过程当中的,只需我们掌控住这一环节,就能够更好的发明、剖析、处置和防备Java的中文成绩了。
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。 |
|