关于Java编程的中文问题的几条分析原则[2]

文章作者 100test 发表时间 2007:08:01 13:07:27
来源 100Test.Com百考试题网


  相对于方法1),2),4)来说,方法3)具有更好的针对性和灵活性。程序可以根据不同的情况做出灵活的处理,在任何需要的地方进行字符的编码转换,但是该方法的特点也对软件的开发人员提出了更高要求--必须能够准确的捕捉到有可能发生中文处理问题的地方,并做出正确的判断和处理。

  分析的原则

  总的说来,所有解决Java中文处理的方法都不是很复杂。相反的是,由于Java技术特别是J2EE技术涉及的内容繁多,各种Web服务器、应用服务器以及JDBC数据库驱动等参差不齐,所以如何正确而及时的发现应用的中文处理问题则变得相对复杂的多。那么我们如何来发现这些问题呢?

  通常,Java处理中文时所产生的问题都是由于用户的Java应用所采用的缺省编码格式与目标或者应用所要读入字符的编码格式不同而造成的,而引起这些不同的一个主要原因就是用户的Java应用与其它应用进行了编码格式不匹配的数据交换(包括直接或间接的数据输入、输出)。所以,为了及时发现问题,我们可以由这一点入手,根据以下的原则对应用进行分析:

  1、注意字符变量情况。由于变量的字符编码形式较为隐蔽,多次变量间数值的改变和运算可能会引起字符集的改变;在变量与页面所提交数据的各种操作中,较容易发生不同编码格式字符进行运算的情况。

  2、注意任何形式的字符读入与输出。之所以要提到任何形式,是因为Java应用大多数都是作为网络应用开发的,所以与其它语言的应用相比,Java应用需要面对网络世界各种各样的字符数据交换形式。例如各种表单的数据提交,URL形式的数据读入,经过加密运算的字符数据交换,网页控件选择结果的输入,控件内容的的显示(如List控件)等等。

  3、小心使用第三方的组件和应用。由于第三方组件和应用的实现是非透明的,所以一般情况下,我们很难判断这些组件或驱动的缺省编码格式是什么,也无法对其进行控制。因此,在使用它们所提供的接口函数进行数据交换的时候要特别注意,如果确实出现中文无法正确处理情况,应首先检查我们自己的代码并调整相关代码以适应这些接口,因为这些组件或者应用基本上不会提供调整编码机制的接口。必要时,我们可能需要采用其它可替换的组件或者应用。

  4、注意被请求对象所含有的数据输入与输出。这是非常隐蔽的一类情况,当我们的应用以对象的方式(例如序列化的对象)进行交互时,如果这个对象内部含有字符数据的处理过程,或者含有某些数据的输入、输出,甚至是抛出一段用中文注解的异常,都可能出现中文无法正确显示等问题。由于这些行为往往被封装在对象中,所以我们在编写程序时,很容易忽略这种可能情况。并且这种情况带有一定的不可预见性,例如我们可能不清楚这个对象会在什么时候抛出什么样的异常,所以这时我们就需要做一定的测试工作。

  5、注意数据库的数据访问过程。Java通过JDBC与数据库建立连接。对于JDBC驱动程序来说,由于目前大部分的JDBC驱动程序并不是针对中文系统而设计的(中文数据大都采用ISO-8859-1编码方式),所以一般情况下在数据读写过程中往往都需要字符编码的转化。但是我们仍建议用户在使用这些JDBC驱动时,仔细阅读它的说明。如果确实无法弄清JDBC字符数据的编码到底是什么,我们的建议是做一些必要的测试。例如下面是一组在简体中文Win2000平台下,采用Weblogic 6.0所提供的JDBC驱动从MS SQL Server2000中正确读入中文字符的代码(例子中进行了字符运算):

...

Class.forName("weblogic.jdbc.mssqlserver4.Driver").newInstance().

conn = myDriver.connect("jdbc:weblogic:mssqlserver4", props).

conn.setCatalog("labmanager").

Statement st = conn.createStatement().

//execute a query

String testStr.

String testTempStr = new String() .

testStr = new String(testTempStr.getBytes("ISO-8859-1")).//编码转化

DatabaseMetaData DBMetaData =conn.getMetaData().

ResultSet rs = DBMetaData.getTables(null,null,null,new String[]{"TABLE"}).

while (rs.next()){

for(int j=1. j<=rs.getMetaData().getColumnCount(). j ){

testStr = testStr String(rs.getObject(j).toString().getBytes("ISO-8859-1")).

}

}

  然而,需要注意的是,不同的JDBC驱动对相同的数据库的支持并不同,而同一类JDBC驱动对不同的数据库的支持也不相同,也就是说我们的字符转化代码在JDBC驱动改变甚至是版本变化情况下都有可能无法正确工作。例如对于上面的例子,在同样的环境下改用i-net 的Una 2000 Driver Version 2.03 for MS SQL Server时,是无法正确处理中文的。原因很简单,这个JDBC驱动本身支持的就是GBK的编码机制,所以根本就不需要做任何的编码转化。

  6、必要的测试。由于Java中文问题的产生随着Web服务器,浏览器,运行环境和开发工具的不同都可能发生变化,所以为了更好的避免问题的发生,我们必须作一些针对性的测试。另外,在我们确实无法通过分析来确定Java的中文处理问题是否可能发生的情况下或者无法知道问题的发生是由于哪个环节(是Web服务器,浏览器还是JDBC数据驱动等等)引起的时候,测试工作则变得非常重要。并且我们可能需要较为全面的测试,例如对Web服务器,浏览器和JDBC数据驱动等都要做测试,这样有利于我们找出那些隐藏在多个环节协调过程中所产生的问题。

  结论

  事实上,Java中文处理之所以存在问题,其根本原因是由于被操作的中文字符(变量)的编码格式与目标的编码格式不同造成的,所有这些问题其实都是发生在字符的读入、输出过程中的,只要我们把握住这一环节,就可以更好的发现、分析、处理和预防Java的中文问题了。


src="/java/js/wxgg_java.js">

相关文章


探讨Java与Ruby语言迁移时的安全性[2]
探讨Java与Ruby语言迁移时的安全性[3]
JAVA程序员当如何选择RIA开发环境
探讨Java与Ruby语言迁移时的安全性[1]
关于Java编程的中文问题的几条分析原则[2]
RIA世界里的三种信仰
关于Java编程的中文问题的几条分析原则[1]
如何有效防止Java程序源码被人偷窥?[4]
如何有效防止Java程序源码被人偷窥?[3]
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛