|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
恰恰证明了java的简单,要不怎么没有通过c/c++来搞个这种框架?成绩|中文择要:关于Java使用在处置中文时所存在成绩的会商已相称多了,与年夜部分的会商分歧,本文将从汉字字符的输出和输入的角度来会商Java言语处置中文时所存在的成绩。
只管关于Java在处置中笔墨符时所存在的成绩的会商已不乏其数,但因为Java手艺触及内容广(J2EE包括了十几种相干手艺),手艺供给商单一,面向Java的Web服务器、使用服务器和JDBC数据库驱动等都没有官方的尺度,以是Java使用在处置中文时出了存在固有的成绩外也会跟着选用的服务器、驱动程序的分歧发生一些与平台相干的成绩。也就是说,在处置中文成绩时,Java代码的可移植性打了扣头。
总的看来,Java的中文处置成绩较为会合地呈现在JSP手艺使用和Java的数据库会见过程当中。这是由于不管是JSP使用仍是基于JDBC的数据库会见都触及到了Java程序与别的一种使用体系的交互,这类交互不成制止的请求体系之间举行数据的交互和参数的传送,而Java处置中文呈现成绩的中央常常就是这些数据读进和输入的中央。
JSP程序所应当注重的中文成绩
以Tomcat3.2.1的JSP使用为例,一样平常碰到中文成绩可使用以下的编码强迫转换函数举行内码的转换。
publicstaticStringtoChinese(Stringstrvalue)
{
try{
if(strvalue==null)
returnnull;
else
{
strvalue=newString(strvalue.getBytes("ISO8859_1"),"GBK");
returnstrvalue;
}
}catch(Exceptione){
returnnull;
}
}
注重,在利用该函数前,我们必要剖析中文没法准确输入的缘故原由究竟是甚么,而不克不及将一切的中文处置的成绩都用这个办法来办理。比方,假如是因为健忘将JSP的输入代码界说为GB2312或GBK而发生的中文没法准确输入就不克不及用这个函数来办理。一个好的习气是在我们编写每个JSP页面时都在文件的第一行界说程序所要输入的字符集,如
<%@pagecontentType="text/html;charset=GBK"%>或<%@pagecontentType="text/html;charset=GB2312"%>
关于一些不撑持界说输入的字符集的JSP版本,我们也能够作以下的设置:
<METAHTTP-EQUIV="Content-Type"CONTENT="text/html;charset=gb2312">
别的还必要注重的是,这个函数是用来办理那些的确呈现了没法准确输入中文的代码,而不是一个通用的用来包管中笔墨符准确输入的函数。因为中笔墨符没法准确的输入或读进的缘故原由都是由于这个字符的编码和体系缺省的字符集编码(大概是使用所要输入的字符集,两者一样平常情形下是不异的)的分歧引发的,以是在使用该函数前我们必需断定我们所要读进或输入的字符的编码究竟与体系缺省的字符集编码是不是不异。
上面的例子将给出该函数的准确和毛病利用的情形。例子所接纳的JSP的体系为Tomcat3.2.1,客户端和服务器真个运转情况都是中文的Windows2000。
例1
<%@pagecontentType="text/html;charset=GBK"%>
<html>
<head>
<title>
testJSP
</title>
</head>
<body>
<h1>
<%
classtestChinaextendsObject{
publicStringtoChinese(Stringstrvalue)
{
try{
if(strvalue==null)
returnnull;
else
{
strvalue=newString(strvalue.getBytes("ISO8859_1"),"GBK");
returnstrvalue;
}
}catch(Exceptione){
returnnull;
}
}
publicvoidtest(){
}
}
testChinatestC=newtestChina();
Stringstr1=newString("这是一个对中文撑持的测试".getBytes("GBK"));
Stringstr2=newString("这是一个对中文撑持的测试".getBytes("GBK"),"ISO-8859-1");
Stringstr3=newString(testC.toChinese(str2));
out.println("Begin<br>");
out.println("str1");
out.println(str1+"<br>");
out.println("str2");
out.println(str2+"<br>");
out.println("str3");
out.println(str3+"<br>");
out.println("End<br>");
System.getProperties().list(System.out);
%>
</h1>
</body>
</html>
我们晓得,Java编程言语默许的编码体例是UNICODE但Java编译器所利用的字符集则是操纵体系的默许字符集,中文的Windows是GBK,英文体系则是ISO-8895-1。关于例1来说,体系的默许字符集是GBK,JSP的输入字符集也是GBK,两者是分歧的。关于str1,我们令其接纳体系默许的字符集编码;关于str2我们决心的将其转换为ISO-8895-1编码以发生中文没法准确输入的了局;str3是testC类的toChinese函数的一个不准确用法,它将底本准确的字符输入转化成了与体系字符集不切合的字符编码,反而引发了形成了中文输入的毛病;str3则是testC类toChinese函数的一个准确用法,它将str2的字符输入毛病改正了过去。以是我们必定要准确剖析字符输入不一般的缘故原由再利用toChinese函数。那末我们怎样来辨别那些字符大概呈现成绩呢。上面有几个次要的准绳必要注重:
1)次要思索字符变量情形。因为变量的字符编码情势较为潜伏,屡次的变量间数值的改动和运算大概会引发字符集的改动;在变量与页面所提交数据的各类操纵中,较简单产生分歧编码格局字符举行运算的情形。
2)注重字符的读进,读出。年夜部分字符的编码格局与方针编码格局产生抵触的情形势产生在字符的读进和输入历程。比方Form的提交,URL的失掉和控件内容的显现(如List控件)等等。
3)需要的时分必要作测试。因为Java的中文成绩的发生跟着Web服务器,扫瞄器,运转情况和开辟工具的分歧都大概产生变更,以是为了更好的制止成绩的产生,我们必需作一些针对性的测试。
固然办理Java中文成绩的办法其实不范围于强迫编码输入这一种。我们也能够接纳上面的办法练办理:
1)以javac-encodingbig5sourcefile.java大概javac-encodinggb2312sourcefile.java的体例编译源程序。
2)接纳Java2JDK的中文当地化版本(http://java.sun.com/products/jdk/1.2/chinesejdk.html),但该版本是一种非官方的版本,Sun公司其实不包管它的晋级。
数据库会见过程当中的中文成绩
经由了下面的会商,关于数据库会见过程当中所存在的中文成绩也就不太难了解了。
今朝,年夜部分的JDBC驱动程序并非针对中文体系来计划的(中文数据多数接纳ISO-8859-1编码体例),以是在数据读写过程当中常常必要字符编码的转化。
假如体系运转在中文操纵体系平台下,则:
1)中笔墨符的读进,能够接纳以下的代码:
strChinese=newString(String(rs.getObject(j).toString().getBytes("ISO-8859-1"));
关于Win2000平台下,接纳Weblogic6.0所供应的JDBC驱动来读进中文代码可以下来编写(例子中举行了字符运算):
DrivermyDriver=(Driver)Class.forName("weblogic.jdbc.mssqlserver4.Driver").newInstance();
conn=myDriver.connect("jdbc:weblogic:mssqlserver4",props);
conn.setCatalog("labmanager");
Statementst=conn.createStatement();
file://executeaquery
StringtestStr;
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"));
}
}
2)中文的输入。中文的输入与读进恰好是个逆历程。我们必要将字符的体系缺省编码转化为JDBC撑持的ISO-8859-1编码。代码能够以下编写:
tempBytes=strInput.getText().getBytes();
SQLstr=newString(tempBytes,”ISO-8859-1”);
必要注重的是,分歧的JDBC驱动对不异的数据库的撑持其实不同,而统一类JDBC驱动对分歧的数据库的撑持也不不异,也就是说我们的字符转化代码在JDBC驱动改动的时分必需作需要的测试才干断定其是不是事情一般,否则我们反而会酿成了多此一举。比方关于i-net的Una2000DriverVersion2.03forMSSQLServer,我们基本就不必要做任何的编码转化就能够完成中文的一般操纵。可是,因为良多的JDBC的驱动并没有明白的给出其对中笔墨符的撑持情形,以是倡议在利用JDBC时都作一下测试。
结论
现实上,Java中文处置之以是存在成绩,其基本缘故原由是因为被操纵的中笔墨符(变量)的编码格局与方针的编码格局分歧酿成的,一切这些成绩实在都是产生在字符的读进、输入过程当中的,只需我们掌控住这一环节,就能够更好的了解和处置Java的中文成绩了。
但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net就不一样了,保持微软的一向风格,源代码不公开 |
|