电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> JSP教程
漫谈Java中的中文问题-JSP教程,Java技巧及代码
作者:网友供稿 点击:21
  西部数码-全国虚拟主机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.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·IReport与JasperReport开发详解一-JSP教程,Java技巧及代码
·JSTL(JSP标准标签库)介绍-JSP教程,资料/其它
·格式化输入日期时间控件 JieFormattedDateBox-JSP教程,Java技巧及代码
·JSTL简化JSP编码-JSP教程,Jsp/Servlet
·JUnit和单元测试入门简介-JSP教程,Java技巧及代码
·从数据库中读取一个图片并保存为一个图片文件-JSP教程,数据库相关
·Java Swing入门基础-JSP教程,Java技巧及代码
·IntelliJ IDEA培训-JSP教程,Java技巧及代码
·通过JSP的预编译消除性能瓶颈-JSP教程,Jsp/Servlet
·Java中利用JMF编写摄像头拍照程序-JSP教程,Java技巧及代码

最新文章
·J2ME中的时间处理方法
·J2ME播放声音流程简介
·J2ME开发之手机键盘使用注意问题
·J2ME 记录管理存储
·MVC模式在j2me项目中的应用(二)
·MVC模式在j2me项目中的应用(一)
·J2ME中使用记录存储系统(RMS)存储信息
·J2ME与MIDP开发(1)
·用简单的J2ME程序测试MIDlet的生命周期
·JAVA基础:提升JSP应用程序的七大绝招


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号