2019年05月25日(星期六)  农历:己亥年四月廿一
  • 首页
  • JAVA
  • 开发中对于Java中文问题的几条分析原则

作者:三年。分类: JAVA 标签: java java基础 学习 开发

尽管关于Java中文疑问的评论现已适当多了,但因为Java的有关技能规范繁复,面向Java的Web效劳器、运用效劳器以 及JDBC数据库驱动等都没有官方的规范,所以Java运用在处理中文时所存在的疑问不只没有消失而且跟着所选用的效劳器、驱动程序以及运转环境等要素的 不一样而改变。那么咱们怎么从很多景象中找出疑问所在,并进行剖析和处理呢?与大多数的评论不一样,这篇文章将主要从怎么猜测、发现和查看疑问的角度给出主张,帮 助开发人员找出也许导致疑问的各种源头,然后十分好地处理Java的中文疑问。

导言

尽管关于Java中文处理疑问的评论已不乏其数,但因为Java技能触及内容广(J2EE包含了十几种有关技能),技能供应商繁复,面向 Java的Web效劳器、运用效劳器以及JDBC数据库驱动等都没有官方的规范,所以Java运用在处理中文进程中出了存在固有的疑问外也存在跟着选用的 效劳器,驱动程序的不一样而带来的Java中文疑问的多变性,增加了疑问的杂乱度。那么,咱们怎么在这么纷繁的景象中找到疑问的症结呢?

Java中文疑问的通常处理办法

事实上,Java的中文疑问都是因为Java运用所选用的缺省编码格局与方针或许运用所要读入字符的编码格局不一样而形成的(具体拜见文献1)。关于怎么处理Java的中文疑问,通常有四种办法:

1) 挑选JDK的中文本地化版别。尽管Java2 JDK的中文本地化版别(http://java.sun.com/products/jdk/1.2/chinesejdk.html)并不是一个官方的版别,Sun公司也没有许诺会对该本地化版别进行晋级,但其仍不失为一个Java中文疑问的处理方案。

2) 挑选适宜的编译参数。关于Java的国际版别来讲,咱们也能够在编译Java运用的时分经过指定断定的编码机制来完成其编译成果对中文的支撑。例如,关于 需求支撑繁体中文和简体中文运用能够经过javac -encoding big5 sourcefile.javajavac -encoding gb2312 sourcefile.java来编译源程序。

3) 经过编程的办法完成字符编码的变换代码。经过编程的办法来处理Java的中文疑问,现已成为了一种较为遍及的做法。下面即是一种最多见的字符编码变换函数,其将字符的编码格局变换为中文Windows体系的GBK编码办法。


public static String toChinese(String strvalue)
   {
         try{
             if(strvalue==null)
                return null;
             else
             {
                strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
                return strvalue;
         }
         }catch(Exception e){
               return null;
         }
   }

4) 界说字符输出集。关于JSP运用,咱们能够经过< %@ page contentType="text/html; charset=GBK" % >或< %@ page contentType="text/html; charset=GB2312" % >来界说JSP页面的字符输出集。当然,咱们也能够经过HTML的标记< META HTTP-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平台下,选用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的中文疑问了。


温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/2506 人参与

发表评论:



手Q扫描加入Java初学者群