摘要:关于Java应用在处理中文时所存在问题的讨论已经相当多了,与大部分的讨论不同,本文将从汉字字符的输入和输出的角" />
龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

漫谈Java中的中文问题

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
?XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" /> 摘要:关于Java应用在处理中文时所存在问题的讨论已经相当多了,与大部分的讨论不同,本文将从汉字字符的输入和输出的角

<?XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" /> 

摘要:关于Java应用在处理中文时所存在问题的讨论已经相当多了,与大部分的讨论不同,本文将从汉字字符的输入和输出的角度来讨论Java语言处理中文时所存在的问题。
  
  尽管关于Java在处理中文字符时所存在的问题的讨论已不乏其数,但由于Java技术涉及内容广(J2EE包含了十几种相关技术),技术供给商繁多,面向Java的Web服务器、应用服务器以及JDBC数据库驱动等都没有官方的标准,所以Java应用在处理中文时出了存在固有的问题外也会随着选用的服务器、驱动程序的不同产生一些与平台相关的问题。也就是说,在处理中文问题时,Java代码的可移植性打了折扣。
  
  总的看来,Java的中文处理问题较为集中地出现在jsp技术应用和Java的数据库访问过程中。这是因为无论是JSP应用还是基于JDBC的数据库访问都涉及到了Java程序与另外一种应用系统的交互,这种交互不可避免的要求系统之间进行数据的交互和参数的传递,而Java处理中文出现问题的地方往往就是这些数据读入和输出的地方。
  
  JSP程序所应该注重的中文问题
  
  以Tomcat 3.2.1的JSP应用为例,一般碰到中文问题可以使用如下的编码强制转换函数进行内码的转换。
  
  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;
  }
  }
  
  注重,在使用该函数前,我们需要分析中文无法正确输出的原因到底是什么,而不能将所有的中文处理的问题都用这个方法来解决。例如,假如是由于忘记将JSP的输出代码定义为GB2312或GBK而产生的中文无法正确输出就不能用这个函数来解决。一个好的习惯是在我们编写每一个JSP页面时都在文件的第一行定义程序所要输出的字符集,如
  
  <%@ page contentType="text/Html; charset=GBK" %>或<%@ page contentType="text/html; charset=GB2312" %>
  
  对于一些不支持定义输出的字符集的JSP版本,我们也可以作如下的设置:
  
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
  
  另外还需要注重的是,这个函数是用来解决那些确实出现了无法正确输出中文的代码,而不是一个通用的用来保证中文字符正确输出的函数。由于中文字符无法正确的输出或读入的原因都是因为这个字符的编码和系统缺省的字符集编码(或者是应用所要输出的字符集,二者一般情况下是相同的)的不同引起的,所以在应用该函数前我们必须确定我们所要读入或输出的字符的编码到底与系统缺省的字符集编码是否相同。
  下面的例子将给出该函数的正确和错误使用的情况。例子所采用的JSP的系统为Tomcat 3.2.1,客户端和服务器端的运行环境都是中文的Windows2000。
  
  例1
  
  <%@ page contentType="text/html; charset=GBK" %>
  
  <html>
  
  <head>
  
   <title>
  
  testJSP
  
   </title>
  
  </head>
  
  <body>
  
  <h1>
  
  <%
  
   class testChina extends Object{
  
  public 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;
  
  }
  
   }
  
   public void test(){
  
   }
  
  }
  
  testChina testC = new testChina();
  
  String str1 =new String("这是一个对中文支持的测试".getBytes("GBK"));
  
  String str2=new String("这是一个对中文支持的测试".getBytes("GBK"),"ISO-8859-1");
  
  String str3 =new String(testC.toChinese(str2));
  
  out.println("Begin
  ");
  
  out.println("str1");
  
  out.println(str1+"
  ");
  
  out.println("str2");
  
  out.println(str2+"
  ");
  
  out.println("str3");
  
  out.println(str3+"
  ");
  
  out.println("End
  ");
  
  System.getProperties().list(System.out);
  
  %>
  
  </h1>
  

精彩图集

赞助商链接