仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1258|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网站制作之关于Java中文成绩的几条剖析准绳

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:53:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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编码情势。
  1. 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中准确读进中笔墨符的代码(例子中举行了字符运算):
    1. ...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的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
变相怪杰 该用户已被删除
沙发
发表于 2015-1-21 16:42:14 来自手机 | 只看该作者
是一种为 Internet发展的计算机语言
冷月葬花魂 该用户已被删除
板凳
发表于 2015-1-30 21:15:54 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
地板
发表于 2015-2-2 21:38:39 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
只想知道 该用户已被删除
5#
发表于 2015-2-6 13:19:05 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
柔情似水 该用户已被删除
6#
 楼主| 发表于 2015-2-9 10:55:34 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
爱飞 该用户已被删除
7#
发表于 2015-2-10 23:44:28 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
飘灵儿 该用户已被删除
8#
发表于 2015-2-20 01:58:24 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
莫相离 该用户已被删除
9#
发表于 2015-2-24 21:57:29 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
金色的骷髅 该用户已被删除
10#
发表于 2015-2-25 15:02:49 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
山那边是海 该用户已被删除
11#
发表于 2015-3-4 11:49:56 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
不帅 该用户已被删除
12#
发表于 2015-3-11 19:21:52 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
谁可相欹 该用户已被删除
13#
发表于 2015-3-20 03:25:12 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
乐观 该用户已被删除
14#
发表于 2015-3-20 20:33:14 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
分手快乐 该用户已被删除
15#
发表于 2015-3-28 11:24:36 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
第二个灵魂 该用户已被删除
16#
发表于 2015-3-28 15:14:16 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
再见西城 该用户已被删除
17#
发表于 2015-4-1 15:09:17 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
活着的死人 该用户已被删除
18#
发表于 2015-4-5 04:48:13 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
飘飘悠悠 该用户已被删除
19#
发表于 2015-4-10 06:54:14 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
精灵巫婆 该用户已被删除
20#
发表于 2015-4-23 17:23:55 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 07:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表