首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 其他工具
漫谈Java中的中文问题-JSP教程,Java技巧及代码
作者:网友供稿 点击:22
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
摘要:关于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<br>");

out.println("str1");

out.println(str1+"<br>");

out.println("str2");

out.println(str2+"<br>");

out.println("str3");

out.println(str3+"<br>");

out.println("end<br>");

system.getproperties().list(system.out);

%>

</h1>

</body>

</html>

  我们知道,java编程语言默认的编码方式是unicode但java编译器所使用的字符集则是操作系统的默认字符集,中文的windows 是gbk,英文系统则是iso-8895-1。对于例1来讲,系统的默认字符集是gbk,jsp的输出字符集也是gbk,二者是一致的。对于str1,我们令其采用系统默认的字符集编码;对于str2我们刻意的将其转换为iso-8895-1编码以产生中文无法正确输出的结果;str3是testc类的 tochinese函数的一个不正确用法,它将原本正确的字符输出转化成了与系统字符集不符合的字符编码,反而引起了造成了中文输出的错误;str3则是 testc类tochinese函数的一个正确用法,它将str2的字符输出错误纠正了过来。所以我们一定要正确分析字符输出不正常的原因再使用 tochinese函数。那么我们如何来区分那些字符可能出现问题呢。下面有几个主要的原则需要注意:

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

  2) 注意字符的读入,读出。大部分字符的编码格式与目标编码格式发生冲突的情况势发生在字符的读入和输出过程。例如form的提交,url的得到以及控件内容的显示(如list控件)等等。

  3) 必要的时候需要作测试。由于java的中文问题的产生随着web服务器,浏览器,运行环境和开发工具的不同都可能发生变化,所以为了更好的避免问题的发生,我们必须作一些针对性的测试。

  当然解决java中文问题的方法并不局限于强制编码输出这一种。我们也可以采用下面的方法练解决:

  1) 以javac -encoding big5 sourcefile.java 或者javac -encoding gb2312 sourcefile.java的方式编译源程序。

  2) 采用java2 jdk的中文本地化版本(http://java.sun.com/products/jdk/1.2/chinesejdk.html),但该版本是一种非官方的版本,sun公司并不保证它的升级。

  数据库访问过程中的中文问题

  经过了上面的讨论,对于数据库访问过程中所存在的中文问题也就不太难理解了。

  目前,大部分的jdbc驱动程序并不是针对中文系统来设计的(中文数据大都采用iso-8859-1编码方式),所以在数据读写过程中往往需要字符编码的转化。

  如果系统运行在中文操作系统平台下,则:

  1) 中文字符的读入,可以采用如下的代码:

strchinese= new string(string(rs.getobject(j).tostring().getbytes("iso-8859-1"));

  对于win2000平台下,采用weblogic 6.0所提供的jdbc驱动来读入中文代码可如下来编写(例子中进行了字符运算):

driver mydriver = (driver) class.forname("weblogic.jdbc.mssqlserver4.driver").newinstance();

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

conn.setcatalog("labmanager");

statement st = conn.createstatement();

file://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"));

}

}


  2) 中文的输出。中文的输出与读入正好是个逆过程。我们需要将字符的系统缺省编码转化为jdbc支持的iso-8859-1编码。代码可以如下编写:

tempbytes=strinput.gettext().getbytes();

sqlstr=new string(tempbytes,”iso-8859-1”);

  需要注意的是,不同的jdbc驱动对相同的数据库的支持并不同,而同一类jdbc驱动对不同的数据库的支持也不相同,也就是说我们的字符转化代码在 jdbc驱动改变的时候必须作必要的测试才能确定其是否工作正常,不然我们反而会变成了画蛇添足。例如对于i-net 的una 2000 driver version 2.03 for ms sql server,我们根本就不需要做任何的编码转化就可以实现中文的正常操作。但是,由于很多的jdbc的驱动并没有明确的给出其对中文字符的支持情况,所以建议在使用jdbc时都作一下测试。

  结论

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


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·用javascript调用webservice(webservice behavior)-ASP教程,ASP应用
·Java中对文件的操作-JSP教程,Java技巧及代码
·VB.net进阶:VB.net下的Sniffer-.NET教程,VB.Net语言
·如何利用VB.NET修改系统时间-.NET教程,VB.Net语言
·电源技术与电子变压器
·解析几种有效开关电源电磁干扰抑制
·教你完全卸载智能abc输入法
·电源系统中多个子系统之间电磁兼容
·ASP.net 2.0 自定义控件的开发之数据分页 第一章-.NET教程,Asp.Net开发
·VS2005新控件之GridView 使用高级技巧系列[二][视频]-.NET教程,评论及其它
最新文章
·3000ip以下网站该如何赚钱_网赚技巧
·谈谈我的下载站日ip5000 月收入3000的经验_站长心得
·photoshop绘制逼真的自然背景:山间瀑布_photoshop教程
·删掉系统文件 让windows vista少占用我们的硬盘_windows vista
·突出网页内重要内容保证adsense匹配准确_网赚技巧
·借台电脑办网站—访深圳外来工站长姚永卫_站长访谈
·创建优秀网站的6个好习惯_站长心得
·做一个网站 营造氛围有多重要?_站长心得
·如何让网民爱上你的网站?(3)_站长心得
·专家支招域名安全“三原则”有效规避域名掠夺_站长心得
相关主题
  • 漫谈Java数据库存取技术-JSP教程,Java技巧及代码
  • 漫谈Java数据库存取技术-JSP教程,Java技巧及代码
  • 漫谈Java中的中文问题-JSP教程,Java技巧及代码
  • 漫谈Java程序设计中的接口应用-JSP教程,Java技巧及代码
  • 漫谈Java程序设计中的接口应用-JSP教程,Java技巧及代码
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭