|
关于Java编程的中文问题的几条分析原则(2)
存在的问题
根据方法实现的方式,我们可以将以上四种方法分为两类,一类是通过利用某些标准或者规则来实现的方法,上面的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应用与其它应用进行了编码格式不匹配的数据交换(包括直接或间接的数据输入、输出)。所以,为了及时发现问题,我们可以由这一点入手,根据以下的原则对应用进行分析:
1. 注意字符变量情况。由于变量的字符编码形式较为隐蔽,多次变量间数值的改变和运算可能会引起字符集的改变;在变量与页面所提交数据的各种操作中,较容易发生不同编码格式字符进行运算的情况。
2. 注意任何形式的字符读入与输出。之所以要提到任何形式,是因为Java应用大多数都是作为网络应用开发的,所以与其它语言的应用相比,Java应用需要面对网络世界各种各样的字符数据交换形式。例如各种表单的数据提交,URL形式的数据读入,经过加密运算的字符数据交换,网页控件选择结果的输入,控件内容的的显示(如List控件)等等。
3. 小心使用第三方的组件和应用。由于第三方组件和应用的实现是非透明的,所以一般情况下,我们很难判断这些组件或驱动的缺省编码格式是什么,也无法对其进行控制。因此,在使用它们所提供的接口函数进行数据交换的时候要特别注意,如果确实出现中文无法正确处理情况,应首先检查我们自己的代码并调整相关代码以适应这些接口,因为这些组件或者应用基本上不会提供调整编码机制的接口。必要时,我们可能需要采用其它可替换的组件或者应用。
|