中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Web开发 > JSP > Servlets
Javascript传递中文出现乱码问题
作者:未知 时间:2005-07-24 21:22 出处:JR 责编:chinaitpower
              摘要:Javascript传递中文出现乱码问题
   原来自己也没有注意到这个情况,但是在一次实际的开发过程种遇到了这种情况,就是我需要在同一个页面上实现添加和查询,所以就要用到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方法的区别。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有