柔情似水 发表于 2015-1-18 11:54:13

JAVA教程之座谈Java中的中文成绩

恰恰证明了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就不一样了,保持微软的一向风格,源代码不公开

只想知道 发表于 2015-1-21 16:45:54

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

冷月葬花魂 发表于 2015-1-25 23:13:03

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

谁可相欹 发表于 2015-1-28 23:44:03

让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。

柔情似水 发表于 2015-2-1 16:08:22

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

爱飞 发表于 2015-2-3 12:06:07

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

灵魂腐蚀 发表于 2015-2-6 00:41:51

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

深爱那片海 发表于 2015-2-6 01:53:52

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

飘飘悠悠 发表于 2015-2-11 00:07:19

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

乐观 发表于 2015-2-21 19:53:06

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

精灵巫婆 发表于 2015-3-6 20:23:26

Java 编程语言的风格十分接近C、C++语言。

再见西城 发表于 2015-3-12 11:14:30

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

仓酷云 发表于 2015-3-13 00:57:31

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

变相怪杰 发表于 2015-3-16 03:08:06

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

老尸 发表于 2015-3-17 09:17:32

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

若相依 发表于 2015-3-22 03:09:16

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

第二个灵魂 发表于 2015-3-30 15:57:26

是一种将安全性(Security)列为第一优先考虑的语言

再现理想 发表于 2015-4-8 05:28:42

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

愤怒的大鸟 发表于 2015-4-18 20:55:17

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
页: [1]
查看完整版本: JAVA教程之座谈Java中的中文成绩