当前位置: 首页 > 图文教程 > 网络编程 > JSP > 如何在JSP中处理中文

JSP
GET 方式提交的含有特殊字符的参数
java big5到gb2312的编码转换
java Lucene 中自定义排序的实现
hibernate中的增删改查实现代码
jsp 定制标签(Custom Tag)
jsp基础速成精华讲解
IE cache缓存 所带来的问题收藏
关于JSP的一点疑问小结
JSP 多条SQL语句同时执行的方法
jsp include文件时的一个乱码解决方法
在JSTL EL中处理java.util.Map,及嵌套List的情况
jsp 页面显示的一些用法
根据Hibernte的cfg文件生成sql文件
五种 JSP页面跳转方法详解
JSP 防范SQL注入攻击分析
JSP 连接MySQL配置与使用
java eclipse 启动参数
jsp 页面上图片分行输出小技巧
解决jsp开发中不支持EL问题
JSP 页面中使用FCKeditor控件(js用法)

如何在JSP中处理中文


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-04   浏览: 79 ::
收藏到网摘: n/a

                             如何在JSP中处理中文

在一个Web应用中经常需要向服务器传递一些参数,一般通过form向服务器发送一个POST请求。在参数中有可能包含中文信息,如用户信息登记、购物定单中的地址信息等等。参数字符串一般用本地字符集进行编码,如中文采用GB2312或GBK字符集,英文或西欧文字采用ISO8859_1字符集,但在Java程序中一律采用Unicode处理字符串,这就需要有一个编码转换的过程。不幸的是,现有的大部分Java应用服务器都是在英语国家开发出来的,由于缺乏大字符集(中文、日文、韩文等)的应用环境,这些应用服务器在处理HTTP请求参数时都存在一些中文处理的问题,也是最为困扰JSP和Servlet开发者的问题。 

产生这一问题的根本原因是在HTTP请求中缺乏足够的信息来指明客户端所使用的字符集。在一个JSP页面中我们可以通过下面的伪指令来指明输出页面所使用的字符集: 



JSP引擎会将上面的伪指令转换为HTTP应答的头部: 

Content-Type: text/html; charset=GB2312 

样输出的就是采用GB2312编码的中文页面,浏览器会正确地显示出中文。但浏览器在将form的内容POST到服务器时却没有包含charset,而且将中文内容用%xx的形式(xx是十六进制数)进行编码,例如汉字"中"的GB2312内码为0xD6D0,在HTTP请求中就变成了%D6%D0,根据RFC2616的规定,如果在HTTP请求中未指明字符集,就使用ISO8859_1编码,这样"中"字在处理时变成了两个字符,分别为'\u00D6'和'\u00D0',而返回到客户端时变成了两个不可显示的字符,浏览器一般显示成'??'。 

解决这一问题的传统做法是编写额外的代码来完成字符集的转换: 

strOut = new String(strIn.getBytes("8859_1"), "GB2312"); 

strIn是未经过转换的字符串,其编码为ISO8859_1,strOut是经过转换的字符串,其编码为GB2312。 

在Apusic 0.9.5版中实现了Java Servlets 2.3规范草案,其中在ServletRequest接口中新增了一个方法setCharacterEncoding(String enc),可以补上在HTTP请求中缺少的charset信息,而上面这一烦琐的转换过程就在Servlet引擎中自动完成了,而且Servlet引擎还对转换过程做了优化,提高了运行效率。下面给出一个简单的例子,大家可以做一下比较。 

// 传统方式 
<%@ page contentType="text/html; charset=gb2312" %> 
<html> 
<body> 
<form method=post action=test.jsp> 
<input type=text name=your_name> 
</form> 
<%= new String(request.getParameter("your_name").getBytes("8859_1"), "GB2312") %> 
</body> 
</html> 

// 新的方式 
<%@ page contentType="text/html; charset=gb2312" %> 
<% request.setCharacterEncoding("GB2312"); %> 
<html> 
<body> 
<form method=post action=test.jsp> 
<input type=text name=your_name> 
</form> 
<%= request.getParameter("your_name") %> 
</body> 
</html>