`
阿尔萨斯
  • 浏览: 4472124 次
社区版块
存档分类
最新评论

彻底解决JSP(含EJB)中文内码问题

 
阅读更多

<sohuadcode><!--test--><table cellspacing="0" cellpadding="0" width="336" align="right" border="0"><tbody><tr><td></td></tr></tbody></table></sohuadcode>   字符内码
  每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展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);
  这样就可以解决问题了,代码如下:
  
    public String getStr(String str){
  try{String temp_p=str;
  byte[] temp_t=temp_p.getBytes(“ISO8859-1”);
  String temp=new String(temp_t);
  return temp;
  }
  catch(Exception e){ }
  return “NULL”;
  }
  %>
  
    String keyword1=request.getParameter(“keyword1”);
  keyword1=getStr(keyword1);
  out.print(keyword);
  out.print(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的资料。
  
  
  相关资料
  1.相关标准组织及标准
  
  国际标准组织Unicode(http://www.icode.org)提供了以下转换表:
  
  GB和Unicode转换表:ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/GB;
  BIG5和Unicode转换表: ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/OTHER
  JIS和Unicode转换表: ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS
  KSC和Unicode转换表: ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/KSC
  由于GBK不是国家标准,所以Unicode并没有提供GBK到Unicode的转换表,而只是采用了Microsoft的CodePage的一个版本
分享到:
评论

相关推荐

    JSP + EJB + Servlet 实例

    使用原始的servlet操作熟悉EJB的实体管理。 本实例主要功能:实现对员工、角色、账号、部门的关系管理。 本实例的实体设计:部门-员工:一对多。员工-账号:一对一。账号-角色:一对一。 主要采用EJB进行会话管理。...

    Java for the Web with Servlets,JSP,and EJB,A Developer's Guide to J2EE Solutions

    Java for the Web with Servlets, JSP and EJB is the one book you need to master Java web programming. It covers all the technologies needed to program web applications in Java using Servlets 2.3, JSP ...

    jsp+servlet+EJB3.0网上书店

    【jsp+servlet+EJB3.0网上书店】项目是一个典型的Java Web应用程序,它结合了三种核心技术来构建一个基本的在线电子书商城。下面将详细解释这些技术及其在项目中的作用。 1. JSP(JavaServer Pages):JSP是Java...

    Java for the Web with Servlets, JSP, and EJB

    Java for the Web with Servlets, JSP and EJB is the one book you need to master Java web programming. It covers all the technologies needed to program web applications in Java using Servlets 2.3, JSP ...

    jsp+servlet+EJB简单应用

    **正文** ...JSP、Servlet和EJB的结合使用,能够提供强大且灵活的Web应用解决方案,尤其适合大型企业级项目。通过不断地学习和实践,开发者可以更好地理解和掌握这些技术,从而提高开发效率和产品质量。

    JSP调用EJB例子[归类].pdf

    在Java企业级应用开发中,JavaServer Pages (JSP) 和Enterprise JavaBeans (EJB) 是两种关键的技术,用于构建动态网页和业务逻辑组件。本示例主要介绍如何在JBoss 4.0环境中,使用JSP调用EJB组件。JBoss 4.0是一个...

    基于MVC设计模式构筑JSPServlet+EJB的Web应用

    ### 基于MVC设计模式构筑JSP/Servlet+EJB的Web应用 #### 概述 随着互联网的快速发展,Web应用已经从简单的静态内容发布转变为支持动态交互内容的处理,例如在线娱乐、电子商务等。为了满足这些变化,Web应用程序...

    Java Jsp EJB Spring学习

    【Java Jsp EJB Spring 学习】 Java Jsp EJB Spring 是企业级软件开发中的核心技术,它们在构建高效、可扩展的Web应用程序方面发挥着关键作用。让我们逐一深入探讨这些技术及其相互间的关联。 首先,JavaServer ...

    基于JSP Servlet和EJB的学生教务管理系统

    【基于JSP Servlet和EJB的学生教务管理系统】是一个典型的J2EE应用程序,它整合了多种技术来构建高效、可扩展的教育管理平台。在这个系统中,JSP(JavaServer Pages)用于创建动态网页,Servlet作为控制器处理HTTP...

    NIIT考试(j2ee javabean sevlet jsp ejb)

    【标题】"NIIT考试(j2ee javabean sevlet jsp ejb)"涉及到的是一场关于Java企业级开发的考试,其中涵盖了多个关键知识点,主要包括Java 2 Enterprise Edition (J2EE)、JavaBeans、Servlets、JSP(JavaServer Pages)...

    ejb 中文帮助文档

    《深入解析EJB3中文帮助文档》 在深入解析EJB3中文帮助文档之前,我们首先需要理解EJB(Enterprise JavaBeans)的概念及其在企业级应用中的重要性。EJB是Java平台为企业级应用程序设计的一套标准框架,主要用于构建...

    EJB API中文版

    ### EJB API中文版知识点详解 #### 一、EJB技术概述 EJB(Enterprise JavaBeans)是J2EE(Java 2 Enterprise Edition)平台的关键技术之一,它为开发基于Java的企业级应用提供了强有力的支持。EJB规范定义了一种...

    j2ee without ejb 中文 part2

    j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee ...

    J2EE学习资料(EJB、Servle、Jsp)

    J2EE的核心组件包括Servlets、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)等,这些都是Java Web开发中的关键概念。 **Servlets** Servlet是Java编程语言中用于扩展服务器功能的Java类。它们主要用于...

    ejb3.0写的登陆应用

    EJB(Enterprise JavaBeans)3.0是Java企业级应用开发的一个重要版本,它极大地简化了EJB的使用,降低了开发复杂性,并引入了许多新特性。在这个“ejb3.0写的登陆应用”中,我们可以深入探讨EJB 3.0在实现登录应用中...

    java笔试题集合(jsp、java、ejb)

    例如,理解JSP的生命周期,编写简单的Java程序,设计EJB架构,以及解决实际问题的能力。此外,还要关注最新技术动态,如Spring框架、微服务、云原生等,这些都是现代Java开发的重要组成部分。 通过深入学习和练习,...

    EJB方面 ejb pdf

    - **技术栈集成**:EJB 2.0与JSP、Servlet、JNDI、JDBC、JMS等技术紧密集成,形成完整的J2EE平台,支持构建高度复杂的企业应用。 #### EJB与JavaBean的区别 EJB和JavaBean虽同属Java生态,但它们的应用场景和特性...

Global site tag (gtag.js) - Google Analytics