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

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网页制作-> 心得技巧
JSP中文乱码问题的解决.-JSP教程,Java技巧及代码
作者:网友供稿 点击:766
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
最后用到的一句代码是:

<%= new string(rst.getstring(2).getbytes("iso-8859-1"),"gb2312")%>



大家在jsp的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在jsp开发中遇到的中文乱码的问题及解决办法写出来供大家参考。

一、jsp页面显示乱码
下面的显示页面(display.jsp)就出现乱码:










对不同的web服务器和不同的jdk版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在jsp页面中指定编码方式(gb2312),即在页面的第一行加上:,就可以消除乱码了。完整页面如下:












二、表单提交中文时出现乱码
下面是一个提交页面(submit.jsp),代码如下:



















下面是处理页面(process.jsp)代码:











如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用utf-8编码方式来发送请求,而utf-8和gb2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.secharacterencoding("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的process.jsp代码如下:













三、数据库连接出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库url中加上useunicode=true&characterencoding=gbk就ok了。

四、数据库的显示乱码
在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:
public class convert {
/** 把iso-8859-1码转换成gb2312
*/
public static string isotogb(string iso){
string gb;
try{
if(iso.equals("") || iso == null){
return "";
}
else{
iso = iso.trim();
gb = new string(iso.getbytes("iso-8859-1"),"gb2312");
return gb;
}
}
catch(exception e){
system.err.print("编码转换错误:"+e.getmessage());
return "";
}
}
}
把它编译成class,就可以调用convert类的静态方法isotogb()来转换编码。





和java一样,jsp是目前比较热门的一个话题。它是一种在服务器端编译执行的web设计语言,因为脚本语言采用了java,所以jsp继承了java的所有优点。可是在使用jsp程序的过程中,常遇到中文乱码问题,很多人为此头疼不已,笔者就深受其害,而且使用平台不同,中文乱码问题的解决方法也不同,无形中增加了学习jsp的难度。其实,在彻底了解相关原因后,问题还是比较容易解决的。笔者结合自己的工作实践,对中文显示问题进行了一定的研究,并在不同的环境下进行了相关测试,以下是笔者总结的解决方法,相信对读者会有一定的借鉴意义。
  字符内码
  每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展ascii码、中国的gb2312-80、日本的 jis 等,作为该国家(区域)信息处理的基础,有着统一编码的重要作用。由于各本地字符集代码范围重叠,相互间信息交换困难,软件本地化版本独立维护成本较高。因此有必要将本地化工作中的共性抽取出来,做一致性处理,将特殊的本地化处理内容降低到最少,这就是所谓的国际化(i18n)。各种语言信息被规范为本地信息,而底层字符集采用包含了所有字符的unicode。


字符内码(character code)指的是用来代表字符的内码。我们在输入和存储文档时都要使用内码,内码分为单字节内码和双字节内码。单字节内码的英文全称是single-byte character sets (sbcs),可以支持256个字符编码;双字节内码的英文全称是double-byte character sets(dbcs),可以支持65000个字符编码,主要用来对大字符集的东方文字进行编码。

codepage指的是一个经过挑选的以特定顺序排列的字符内码列表,对于早期的单字节内码的语种,codepage中的内码顺序使得系统可以按照此列表来根据键盘的输入值给出一个对应的内码。对于双字节内码,给出的是multibyte到unicode的对应表,这样就可以把以unicode形式存放的字符转化为相应的字符内码。引入对codepage的支持主要是为了访问多语种文件名,目前在ntfs和fat32/vfat下的文件系统上都使用unicode,这需要系统在读取这些文件名时动态地将其转换为相应的语言编码。

相信了解jsp代码的读者对iso8859-1一定不陌生,iso8859-1是我们平时使用比较多的一个codepage,它属于西欧语系。gb2312-80 是在国内计算机汉字信息技术发展初始阶段制订的,其中包含了大部分常用的一、二级汉字和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。

gbk 是 gb2312-80 的扩展,是向上兼容的。它包含了20902个汉字,其编码范围是 0x8140~0xfefe,剔除高位 0x80 的字位,其所有字符都可以一对一映射到 unicode 2.0,也就是说 java 实际上提供了对 gbk 字符集的支持。

>gb18030-2000(gbk2k) 在 gbk 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的文字。gbk2k 从根本上解决了字位不够、字形不足的问题。


  不同开发平台的区别
  1.tomcat 4开发平台

windows 98/2000下的tomcat 4以上版本都会出现中文问题(而在linux下和tomcat 3.x中则没有问题),主要表现是页面显示乱码。在ie中调整字符集为gb2312,就可以正常显示了。

为解决这个问题,可在每个jsp的页面开始处加上。不过,这还不够,虽然这时显示了中文,但是发现从数据库读出的字段变成了乱码。经过分析发现: 在数据库中保存的中文字符是正常的,数据库用iso8859-1字符集存取数据,而java程序在处理字符时默认采用统一的iso8859-1字符集(这也体现了java国际化思想),所以在数据添加的时候java和数据库都是以iso8859-1方式处理,这样不会出错。但是在读取数据的时候就出现问题了,因为数据读出也采用iso8859-1字符集,而 jsp的文件头中有语句,这说明页面采用gb2312的字符集显示,这样就和读出的数据不一样。这时页面显示从数据库中读出的字符是乱码,解决的方法是对这些字符转码,从iso8859-1转成gb2312,就可以正常显示了。这个解决办法对很多平台具有通用性,读者可以灵活运用。

2.tomcat 3.x、resin及linux平台

在tomcat 3.x、resin中或是在linux下,没有加入语句,而页面中的语句起了作用,此时可以正常显示。相反,如果加上系统会报错,说明tomcat 4以上版本的引擎在处理jsp时还是有差别的。

另外,对于不同的数据库如sql server,oracle,mysql,sybase等,字符集的选择很重要。如果考虑多语言版本,数据库的字符集就应该统一采用iso8859-1,需要输出的时候在不同的字符集之间做转换就可以了。

以下是针对不同平台的总结:

(1) jswdk只适合于普通开发,稳定性和其他问题可能不如商业软件。 由于jdk 1.3版性能要好于jdk 1.2.2很多,并且对中文的支持也较好,所以应该尽量采用。

(2) 作为免费的商业软件,resin不仅速度快、稳定、自动编译,还可以指出出错行,并可在服务器端支持使用javascript等,而且对中文的支持也很好。

(3) tomcat仅仅是一个对jsp 1.1、servlet 2.2标准的实现, 我们不应该要求这个免费软件在细节和性能上都面面俱到, 它主要考虑英文用户, 这也是为什么不做特殊转换,汉字用url方法传递就有问题的原因。大部分ie浏览器缺省始终以utf-8发送, 这似乎是tomcat的一个不足, 另外tomcat不管当前的操作系统是什么语言, 都按iso8859去编译jsp, 似乎也欠妥。


  jsp代码的中文处理
  在jsp代码中以下几处经常需要涉及到中文处理:

1. 在url中附带中文参数。这里中文参数通常可以直接读取,例如:

2. 在jswdk中读取html表单提交的中文值这时需要加以编码,较为简洁的写法是:

string name1=new string(request.getparameter(“user_id”).getbytes(“iso8859_1”))。

另外,在jdk 1.3的支持下,不需加入 ,而在jdk 1.2.2 以下,即使以上两种方法同时运用也很不稳定。但在resin平台,情况较好,只要在页面第一行加入:即可正确处理中文,如果再加代码则反而不对。

3.在jswdk中session包含的中文,如果从表单中读出的值经过编码可正确显示,但直接赋予中文值则不行,而resin平台则很好。

4. 在编译servlet和jsp时加入代码选项。在编译servlet时使用java-encoding iso8859-1 myservlet.java;在jsp的zone配置文件中,修改编译参数为:compiler=builtin - javac- encoding iso8859-1。使用这种方法后,不需要做其他的改动就可以正常显示中文了。

另外,流行的关系数据库系统都支持数据库encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有 encoding 转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性。 gb2312、gbk、utf-8 等都是可选的数据库 encoding,也可以选择 iso8859-1 (8-bit), 但会增加了编程的复杂度,iso8859-1不是推荐的数据库 encoding。在jsp/servlet编程时,可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。


  处理方法实例
  下面是两个具体的中文乱码解决实例,读者仔细研究后可能会有所收获。

1.常见的字符转换方法

将form 中 的 值 传 送 到 数 据 库 中 再 取 出 来 后 全 变 成 了“?”。form用post提交数据,代码中使用了语句:string st=new(request.getparameter(“name”).getbytes(“iso8859_1”)), 而且也声明了charset=gb2312。

要处理form中传递的中文参数,应该在jsp中加入下面的代码,另外定义一个专门解决这个问题的getstr类,然后对接收到的参数进行转换:
  string keyword1=request.getparameter(“keyword1”);
  keyword1=getstr(keyword1);
  这样就可以解决问题了,代码如下:
  
  
  
  

2. jdbc driver的字符转换

目前大多数jdbc driver采用本地编码格式来传输中文字符,例如中文字符“0x4175”会被转成“0x41”和“0x75”进行传输。因此需要对jdbc driver返回的字符以及要发给jdbc driver的字符进行转换。当用jdbc driver向数据库中插入数据时,需要先将unicode转成native code; 当 jdbc driver从数据库中查询数据时,则需要将native code转换成unicode。下面给出了这两种转换的实现:
  string native2unicode(string s) {
  if (s == null || s.length() == 0) {
  return null;
  }
  byte[] buffer = new byte[s.length()];
  for (int i = 0; i s.length(); i++) { if (s.charat(i)>= 0x100) {
  c = s.charat(i);
  byte []buf = (“”+c).getbytes();
  buffer[j++] = (char)buf[0];
  buffer[j++] = (char)buf[1];
  }
  else {buffer[j++] = s.charat(i);}
  }
  return new string(buffer, 0, j);
  }

要注意的是,有些jdbc driver如果通过jdbc driver manager设置了正确的字符集属性,以上方法就不需要了。具体情况可参考相关jdbc的资料。




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

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·Java 调用存储过程-JSP教程,Java技巧及代码
·JSP中文乱码问题的解决.-JSP教程,Java技巧及代码
·Java的网络编程:用Java实现Web服务器-JSP教程,Java技巧及代码
·asp.net连接Access数据库-.NET教程,Asp.Net开发
·VC++.NET 2005 几个比较难缠的问题及其解决方法-.NET教程,.NET Framework
·DropDownList 控件 DataTextField 和 DataValueField 分开绑定-ASP教程,数据库相关
·.Net PetShop 4.0的分布式数据库设计-.NET教程,.NET Framework
·用Asp.net实现新闻分页-.NET教程,Asp.Net开发
·在.NET 2.0 中发送Email-.NET教程,E-mail专题
·逆变桥功率开关管门极关断箝位电路
最新文章
·经典收藏:网页页面常用的特殊符号_心得技巧教程
·用html和css写出漂亮正规的blog_心得技巧教程
·用photoshop优化美眉照片的眼部特写_photoshop教程
·网站页面的均衡规划与选择_心得技巧教程
·关闭远程差分压缩给windows vista拷贝提速_windows vista
·谈google广告的单价与点击-smart_网赚技巧
·用photoshop消除照片中的杂色条纹_photoshop教程
·一个网友观点:两年以来使用div排版的经验_心得技巧教程
·开始使用google adsense_google推广
·google官方讲解noindex、nofollow、noarchive及nosnippet等meta标签用法_google推广
相关主题
  • jsp中文问题解决方案(完整版)_jsp技巧
  • jsp中文乱码问题解决方法小结_jsp技巧
  • JSP中文乱码问题的解决-JSP教程,Jsp/Servlet
  • JSP中文留言簿-JSP教程,Jsp/Servlet
  • JSP中文问题解决方案。-JSP教程,Jsp/Servlet
  • 西部数码虚拟主机

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