jsp中文编码问题与编码问题的一些资料(转载)

转载 2004年09月09日 10:50:00
 

最后用到的一句代码是:

<%= new String(rst.getString(2).getBytes("ISO-8859-1"),"gb2312")%>

 

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

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





<%
out.print("JSP的中文处理");
%>


对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一行加上:<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。完整页面如下:
<%@ page contentType="text/html; charset=gb2312"%>





<%
out.print("JSP的中文处理");
%>

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













下面是处理页面(process.jsp)代码:
<%@ page contentType="text/html; charset=gb2312"%>





<%=request.getParameter("name")%>


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





<%=request.getParameter("name")%>

三、数据库连接出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库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的页面开始处加上<%@?page?language=“Java”?contentType=“text/html;?charset=gb2312”%>。不过,这还不够,虽然这时显示了中文,但是发现从数据库读出的字段变成了乱码。经过分析发现: 在数据库中保存的中文字符是正常的,数据库用ISO8859-1字符集存取数据,而Java程序在处理字符时默认采用统一的ISO8859-1字符集(这也体现了Java国际化思想),所以在数据添加的时候Java和数据库都是以ISO8859-1方式处理,这样不会出错。但是在读取数据的时候就出现问题了,因为数据读出也采用ISO8859-1字符集,而 JSP的文件头中有语句<%@?page?language=“Java”?contentType=“text/html;?charset=gb2312”%>,这说明页面采用GB2312的字符集显示,这样就和读出的数据不一样。这时页面显示从数据库中读出的字符是乱码,解决的方法是对这些字符转码,从ISO8859-1转成GB2312,就可以正常显示了。这个解决办法对很多平台具有通用性,读者可以灵活运用。 

2.Tomcat 3.x、Resin及Linux平台 

在Tomcat 3.x、Resin中或是在Linux下,没有加入语句<%@?page?language=“Java”?contentType=“text/html;?charset=gb2312”%>,而页面中的语句起了作用,此时可以正常显示。相反,如果加上<%@?page?language=“java”?contentType=“text/html;?charset=gb2312”%>系统会报错,说明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中附带中文参数。这里中文参数通常可以直接读取,例如: <%=?request.getParameter(“showword”)%> 

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

String name1=new String(request.getParameter(“user_id”).getBytes(“ISO8859_1”))。 

另外,在JDK 1.3的支持下,不需加入<%@?page?contentType=“text/html;charset=gb2312”%> ,而在JDK 1.2.2 以下,即使以上两种方法同时运用也很不稳定。但在Resin平台,情况较好,只要在页面第一行加入:<%@?page?contentType=“text/html;charset=gb2312”%>即可正确处理中文,如果再加代码则反而不对。 

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); 
  这样就可以解决问题了,代码如下: 
  <%@?page?contentType=“text/html;charset=gb2312”%> 
  <%!?
  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”;?
  }?
  %> 
  <%--url.gifhttp://www.cndes.com测试--%> 
  <%?String?keyword=“创联网络技术中心欢迎您的到来”;?
  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(url.gifhttp://www.icode.org)提供了以下转换表: 

GB和Unicode转换表:url.gifftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/GB
  BIG5和Unicode转换表: url.gifftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/OTHER ;
  JIS和Unicode转换表: url.gifftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS ;
  KSC和Unicode转换表: url.gifftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/KSC ;
  由于GBK不是国家标准,所以Unicode并没有提供GBK到Unicode的转换表,而只是采用了Microsoft的CodePage的一个版本:url.gifftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP{936,950}.TXT。 


  2.相关软件下载
  JDK 1.3 url.gifhttp://java.sun.com ;
  Resin 2.0.1 url.gifhttp://www.caochu.com ;
  Apache 1.3.20 url.gifhttp://www.apache.org ;
  MySQL 3.23 url.gifhttp://www.mysql.org ;
  MySQL 3.23 url.gifhttp://www.mysql.org ;
  DBTools 1.0.12 url.gifhttp://www.dbtools.com.dr ;

解决JSP中文乱码问题

原文:http://www.cnblogs.com/chengkai/articles/2171848.html 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着大家,现把J...
  • luoweifu
  • luoweifu
  • 2014年03月25日 23:46
  • 4060

支付宝接口编码不规范问题

支付宝平台接口使用了不规范的方式,导致flask不能正常处理的问题解决。
  • Raptor
  • Raptor
  • 2016年09月14日 00:07
  • 1711

深入分析 Java 中的中文编码问题

转载出处:http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 编码问题一直困扰着开发人员,尤其在 Java 中更加明显...
  • woaigaolaoshi
  • woaigaolaoshi
  • 2016年03月13日 18:15
  • 1409

Jsp中文编码问题(下)

摘要:   本文首先从四个方面给出了在使用JSP过程中可能出现中文乱码的情形,具体包括JSP页面中文乱码、JSP源文件中文乱码、GET 请求的请求参数为中文乱码 和 POST 请求的请求参数为中文乱码...
  • fuzhongmin05
  • fuzhongmin05
  • 2017年03月30日 21:28
  • 199

JSP中文编码问题

JSP中文编码问题 最基本的乱码问题 这个乱码问题是最简单的乱码问题。一般新会出现。就是页面编码不一致导致的乱码。 Html代码 %@ page language="ja...
  • lizhe10177
  • lizhe10177
  • 2014年05月27日 10:08
  • 267

Jsp中文编码问题(上)

摘要:   本文首先介绍了一个JSP的源文件执行过程,即需要经过三个阶段,两次编码,才能完成一次完整的输出。特别需要注意的是,在这个过程中,编码问题贯穿始终。我们知道在JSP/Servlet中,主要有...
  • fuzhongmin05
  • fuzhongmin05
  • 2017年03月30日 21:13
  • 159

SpringMVC开发过程中的中文乱码问题

相信大家在开发初期遇到中文乱码问题一定是一头雾水,不是数据库乱码了就是页面乱码了或者传值时乱码。其实解决乱码的途径很简单,就是统一编码与解码的类型,我把自己遇到的乱码问题整理出来,希望能够对大家有用。...
  • witness_mei
  • witness_mei
  • 2015年09月20日 14:12
  • 2619

JSP页面编码问题

在学习web开发的时候,可能有很多人被jsp页面编码的问题所困扰,搞不清楚pageEncoding和charset有什么区别。一、Text file encoding(文件编码)1、eclipse配置...
  • LiGuangLiang_bzu
  • LiGuangLiang_bzu
  • 2016年05月31日 16:44
  • 683

python解决中文编码问题

python解决中文编码问题 摘要:因为这段时间做python的中文数据梳理和爬虫,中文数据处理花费了我大量的时间,暂时不做这一块所以留下一些记录。为了快速完成文章,这里对很多文章进行了引用和摘...
  • xz1308579340
  • xz1308579340
  • 2017年04月19日 16:41
  • 766

Python for Windows 中文编码问题汇总

0. 关于python编码的基本常识 1. 设置.py文件的编码格式 2. 字符串文字量的类型 3. 关于print输出中文字符串 4. Windows的文件/文件夹的中文名字 5. Windows读...
  • u013163707
  • u013163707
  • 2016年09月17日 01:13
  • 2238
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jsp中文编码问题与编码问题的一些资料(转载)
举报原因:
原因补充:

(最多只允许输入30个字)