当前位置: 首页 > 图文教程 > 网络编程 > JSP > Javascript传递中文出现乱码问题

JSP
Java 创建cookie和删除cookie
jsp 从web.xml读取连接数据库的参数
jsp 不支持EL表达式,解决办法
jsp 获取客户端的浏览器和操作系统信息
struts2 session 解读
struts2 spring整合fieldError问题
jsp 生成验证码代码
搭建java WEB开发环境和应用
JSP 自定义标签
Java 区分文本中的中英文字符函数
通用JSP页面 jsp入门级文章
jsp struts1 标签实例详解
一个jdbc 测试程序代码
SSH整合中 hibernate托管给Spring得到SessionFactory
jsp SmartUpload 实现上传功能代码
jsp Unsupported encoding: gb2312 错误原因
java Struts2 在拦截器里的跳转问题
jsp 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
Java 项目生成静态页面的代码
jdk与jre的区别 很形象,很清晰,通俗易懂

JSP 中的 Javascript传递中文出现乱码问题


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

   原来自己也没有注意到这个情况,但是在一次实际的开发过程种遇到了这种情况,就是我需要在同一个页面上实现添加和查询,所以就要用到javascript传值了,我采用的架构是MVC,操作系统是XP,服务器是Tomcat5.0.19,数据库是用的Mysql, 我的情况是这样的:
  我在添加的时候在jsp页面提交的时候用的是Form的Action,method用的是Post,中间的过程也是按照我上次写的文章《tomcat下中文的彻底解决》(http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=19240)这篇文章配置过滤器的,数据库用的是链接池,配置也是同上。在我提交代码的时候没有什么大的问题,但是在我查询的时候出现了情况,我在查询的时候采用的是javaScript传值,具体的代码是这样的
function doQuery(){
   var flag=FormVerify();
    if(flag){
      var sUrl="/workshop/queryMaterial.do?materialcode=" + document.MaterialForm.materialcode.value+"&materialname="+document.MaterialForm.materialname.value;
      self.location.href=sUrl;
        }
             return flag;

      }
后来我发现我存在数据库里的数据都不能显示,这个是什么原因呢,在Form里面打了log,发现我在里面输入名字以后,到MVC里面的Form里出现了乱码,结果就导致后面的SQL语句不能识别。为了能让Sql语句识别,我采用了各种转换的方式,比如我想直接在页面里把String的编码转换成UTF-8的,和我页面上的一致,我采用了下面的转换方法:
public static String toUtf8String(String s) { 
StringBuffer sb = new StringBuffer(); 
for (int i=0;i<s.length();i++) { 
char c = s.charAt(i); 
if (c >= 0 && c <= 255) { 
sb.append("="+c); 
} else { 
byte[] b; 
try { 
b = Character.toString(c).getBytes("utf-8"); 
} catch (Exception ex) { 
System.out.println(ex); 
b = new byte[0]; 

for (int j = 0; j < b.length; j++) { 
int k = b[j]; 
if (k < 0) k += 256; 
sb.append("=" + Integer.toHexString(k). 
toUpperCase()); 



return sb.toString(); 
}
但是还是效果不好。有的网友说在接收的时候把代码给修改一下,但是还是不能搞定,如果是用JSP+javaBean的时候这种办法还是可以的,但是我的主要是用的MVC,接受的是后用的Form,这种方法不是很好。
public String toGb(String uniStr){ 
String gbStr = ""; 
if(uniStr == null){ 
uniStr = ""; 

try{ 
byte[] tempByte = uniStr.getBytes("ISO8859_1"); 
gbStr = new String(tempByte,"GB2312"); 

catch(Exception ex){ 

return gbStr; 

为什么我的添加的按钮都没有出现乱码,而查询就出现了呢,我反复的看,终于我发现了问题是处在我的查询的URL的链接,大家可以看一下这个链接:sUrl="/workshop/queryMaterial.do?materialcode=" + document.MaterialForm.materialcode.value+"&materialname="+document.MaterialForm.materialname.value;这个是一个典型的method用的是Get的方法,从$TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的URIEncoding属性可以知道,用get方法传递的时候,这个方法你加过滤器和在页面上指定编码都是不可用的,你如果在服务器的server.xml里如果没有配置这一项的时候,采用Get提交的时候,服务器就会默认的是服务器内部的ISO-8859-1的编码,所以JavaScript传递中文出现乱码的问题根本上就是服务器提交时候Get方法和Post方法的不同,所以就导致了乱码的出现。如果你认识到这里,那就有解决的办法了。
具体的解决办法是:
1)    打开tomcat的server.xml文件,找到区块,加入如下一行URIEncoding="GBK",具体的代码如下: 
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/> 

2)重启tomcat,一切OK。不过我为了统一代码的时候我用了UTF-8,结果是中文中有一个字是出现乱码,比如我要是输入中国的时候,我的log就会出现中是正常的,而国是?,后来我改用了字符集,用了GBK就可以搞定。
这样的话就解决了javascript传递中文出现乱码的问题了。实质上就是Form中post和get方法的区别。