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

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 中的 Javascript传递中文出现乱码问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 188 ::
收藏到网摘: 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方法的区别。