JAVA网站制作之java-汉字成绩深切谈
最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。汉字|成绩1、主题:关于JAVA的中文成绩JAVA的中文成绩对照凸起,次要体现在把持面板输入,JSP页面输入和数据库会见上。
本文只管避开字体成绩,而只谈编码。经由过程本文,你能够懂得JAVA中文成绩的由来,成绩
的办理办法,个中提了一下用JDBC会见数据库的办法。
2、成绩形貌:
1)在中文W2000中文窗口编译和运转,用的是国际版的JDK,毗连的是中文W2000下的Cp936
编码的SQLSERVER数据库:
J:exercisedemoencodeHelloWorld>make
CreatedbyXCompiler.PhiloSoftAllRightsReserved.
WedMay3002:54:45CST2001
J:exercisedemoencodeHelloWorld>run
CreatedbyXRunner.PhiloSoftAllRightsReserved.
WedMay3002:51:33CST2001
中文
[B@7bc8b569
[B@7b08b569
[B@7860b569
中文
中文
????
中文
中文
????
??
??
??
2)假如在中文W2000的西文窗口(编码为437)下编译,用JAVA运转则因为无字体而没法正
常显现,假如象下面一样在中文W2000的中文窗口运转,输入为:
J:exercisedemoencodeHelloWorld>run
CreatedbyXRunner.PhiloSoftAllRightsReserved.
WedMay3002:51:33CST2001
????
[B@7bc0b66a
[B@7b04b66a
[B@7818b66a
????
????
????
????
????
????
中文
中文
????
三)剖析
1)呈现有乱码(也就是?)。因为只呈现?而没呈现小方框,申明只是编码有成绩,而不
是字体成绩。在编码中,假如从一种字符集转换到别一种字符集,对照典范的是从GB2312
转换到ISO8859_1(即ASCII),那末良多汉字(半个汉字)是没法映照到西笔墨符中往的
,在这类情况下,体系就把这些字符用?取代。一样,也存在小字符集没法到年夜字符集的
情形,详细缘故原由这里就谈了。
2)呈现了中文情况编译,中文情况运转时汉字显现有准确也有不准确的中央,一样,在西
文情况下编译,在中文情况下运转时也呈现相似情形。这是因为主动(默许)或手工(也
就newString(bytes[,encode])和bytesgetBytes())转码的了局。
2.1)在JAVA源文件-->JAVAC-->Class-->Java-->getBytes()-->newString()-->显现的过
程中,每步都有编码的转换历程,这个历程老是存在的,只是有的时分用默许的参数进
行。上面我们一步一步剖析为何呈现下面的情况。
2.2)这里是源代码:
HelloWorld.java:
------------------------
publicclassHelloWorld
{
publicstaticvoidmain(String[]argv){
try{
System.out.println("中文");//1
System.out.println("中文".getBytes());//2
System.out.println("中文".getBytes("GB2312"));//3
System.out.println("中文".getBytes("ISO8859_1"));//4
System.out.println(newString("中文".getBytes()));//5
System.out.println(newString("中文".getBytes(),"GB2312"));//6
System.out.println(newString("中文".getBytes(),"ISO8859_1"));//7
System.out.println(newString("中文".getBytes("GB2312")));//8
System.out.println(newString("中文".getBytes("GB2312"),"GB2312"));//9
System.out.println(new
String("中文".getBytes("GB2312"),"ISO8859_1"));//10
System.out.println(newString("中文".getBytes("ISO8859_1")));//11
System.out.println(new
String("中文".getBytes("ISO8859_1"),"GB2312"));//12
System.out.println(new
String("中文".getBytes("ISO8859_1"),"ISO8859_1"));//13
}
catch(Exceptione){
e.printStackTrace();
}
}
}
为了便利起见,在每一个转换的前面加了操纵序号,分离为1,2,...,13。
2.3)必要申明的是,JAVAC是以体系默许编码读进源文件,然后按UNICODE举行编码的。在
JAVA运转的时分,JAVA也是接纳UNICODE编码的,而且默许输出和输入的都是操纵体系的默
认编码,也就是说在newString(bytes[,encode])中,体系以为输出的是编码为encode的
字撙节,换句话说,假如按encode来翻译bytes才干失掉准确的了局,这个了局最初要在JA
VA中保留,它仍是要从这个encode转换成Unicode,也就是说有bytes-->encode字符-->Uni
code字符的转换;而在String.getBytes()中,体系要做一个Unicode字符-->enco
de字符-->bytes的转换。
在这个例子中,除谁人英文窗口编码的时分除外,实在情况下默许编码都是GBK(在本例中
,我们临时把GBK和GB2312同等对待)。
2.4)因为在未指明在下面的两个用代码完成的转换中,假如未指定encode,体系将接纳默
认的编码(这里为GBK),我们以为下面的5,6,7和8,9,10是一样的,8和9、11和12也是一
样的,以是我们在会商中将只会商1,9,10,12,13。个中的2,3,4只是用于测试,不在我们的
会商局限以内。
2.5)上面我们来跟踪程序中的“中”字的转换过程,我们先说在中文窗口下作的编译和运
行历程,注重鄙人面的字母下标中,我无意识地利用了一些数字,以暗示不异,相异仍是
相干2.5.1)我们先以下面的13个代码段中的的代码9为例:
步骤内容地址申明
01:C1HelloWorld.javaC1泛指一个GBK字符
02:U1JAVAC读取U1泛指一个Unicode字符
03:C1getBytes()第一步JAVA先和操纵体系交换
04:B1,B2getBytes()第二步然后前往字节数组
05:C1newString()第一步JAVA先和操纵体系交换
06:U1newString()第二步然后前往字符
07:C1println(String)能显现“中”字,内容和本来的不异
2.5.2)然后再以代码段10为例,我们注重到只是:
步骤内容地址申明
01:C1HelloWorld.javaC1泛指一个GBK字符
02:U1JAVAC读取U1泛指一个Unicode字符
03:C1getBytes()第一步JAVA先和操纵体系交换
04:B1,B2getBytes()第二步然后前往字节数组
05:C3,C4newString()第一步JAVA先和操纵体系交换,这时候剖析毛病
06:U5,U6newString()第二步然后前往字符
07:C3,C4println(String)因为中字给分红了两半,在ISO8859_1中恰好也没有字符
能映照上,以是显现为“??”。在下面的示例中,
“中文”两个字就显现为“????”
2.5.3)在完整中文形式下的别的情况相似,我就未几说了
2.6)我们接着看为何在西文DOS窗口下编译出来的类在中文窗口下也呈现相似情况,特
别是为何竟然有的情况下还能准确显现汉字。
2.6.1)我们仍是先以代码段9为例:
步骤内容地址申明
01:C1C2HelloWorld.javaC1C2分离泛指一个ISO8859_1字符,“中”字被拆开
02:U3U4JAVAC读取U1U2泛指一个Unicode字符
03:C5C6getBytes()第一步JAVA先和操纵体系交换,这时候剖析毛病
04:B5B6B7B8getBytes()第二步然后前往字节数组
05:C5C6newString()第一步JAVA先和操纵体系交换
06:U3U4newString()第二步然后前往字符
07:C5C6println(String)固然同是两个字符,但已不是最后的“两个ISO8859_1字
符”,而是“两个BGK字符”,“中”显现成了“??”
而“中文”就显现成了“????”
2.6.2)上面我们以代码段12为例,由于它能准确显现汉字
步骤内容地址申明
01:C1C2HelloWorld.javaC1C2分离泛指一个ISO8859_1字符,“中”字被拆开
02:U3U4JAVAC读取U1U2泛指一个Unicode字符
03:C1C2getBytes()第一步JAVA先和操纵体系交换(注重仍是准确的哦!)
04:B5B6getBytes()第二步然后前往字节数组(这是很关头的一步!)
05:C12newString()第一步JAVA先和操纵体系交换(这是更关头的一步,JAVA已知
道B5B6要剖析成一个汉字!)
06:U7newString()第二步然后前往字符(真是一个项两!U7包括了U3U4的信息)
07:C12println(String)这就本来的“中”字,很冤枉被JAVAC冤枉了一回,不外被程
序员拨乱归正了一下!固然,“中文”两个字都能准确显现了!
3)那为何有的时分用JDBC的
newString(Recordset.getBytes(int)[,encode])
Recordset.getSting(int)
Recordset.setBytes(String.getBytes())
和
Recordset.setString(String)
的时分会呈现乱码了呢?
实在成绩就呈现在编写JDBC的的也思索了编码成绩,它从数据库读取数据后,大概自作主
张做了一个从GB2312(默许编码)到Unicode的转换,我的这个WebLogicForSQLServer
的JDBCDriver就是如许的,当我读字串的时分,收回读到的不是准确的汉字,可爱的是我
却能够间接写汉字字串,这让人几有点难以承受!
也就是说,我们不能不在读或写的时分举行转码,只管这个转码有的时分不是那末分明,
这是由于我们利用了默许的编码举行转码。JDBCDriver所做的操纵,我们只要进进到源代
码外部才干分明,不是吗?
那这个对象有什么意义?现在很多用javabean的人就不能保证对象有完整的意义,不成熟的使用模式等导致代码疯狂增长,调试维护的时间要得多得多。在说性能之前,先说说你这个比较的来历。据说微软为了证明。net比java好。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
页:
[1]
2