`
daoger
  • 浏览: 531759 次
  • 性别: Icon_minigender_1
  • 来自: 山东济南
社区版块
存档分类
最新评论

参数传递的浏览器差异

阅读更多

情况大体是这样的:一个头页面header.jsp上有一个搜索框,输入关键字之后提交到另一个搜索页面search.jsp输出搜索结果;header.jsp在业务应用下,search.jsp在发布系统的应用下,两个应用使用同一个tomcat。关键字keyword作为参数传递到搜索页面search.jsp,也就是window.location.href='search.jsp?keyword=关键字'。两个页面设置的编码格式都是UTF-8;但是具体测试中出现了很奇怪的问题,就是在firefox下一切正常,参数传递是正常的,搜索中文英文都没有问题;但是在IE下就不行了,搜索汉字时,汉字个数是偶数个时一切正常,奇数个时最后一个汉字接受过来就是乱码;也就是说,search.jsp?keyword=关键,这样是正常的,但是search.jsp?keyword=关键字,这样时你取到的keyword参数最后一个字“字”就是乱码。 查了不少资料,说汉字在UTF-8编码格式下是占3个字节的,而在unicode编码格式下是占2个字节,参数传递的时候需要在unicode编码格式下传递,所以不管你页面中设置的是什么编码格式,传递之前浏览器都会给你自动做编码转化。当汉字个数是偶数个的时候,字节总数也是偶数可以被正常转化,但是当汉字个数是奇数时,字节总数是奇数,无法被2整除,所以最后一个汉字显示乱码。至于firefox下为什么正常,估计是firefox下参数的编码格式转化机制不同所致。

查询到不少解决办法,有的说用js的encodeURI 进行一次编码转换,有的也说用post方式传递,试了之后都不行。 最后的解决办法是在传递之前就对关键字进行一次编码格式的转换,这是网上的代码:

function EncodeUtf8(s1) 
  { 
      var s = escape(s1); 
      var sa = s.split("%"); 
      var retV =""; 
      if(sa[0] != "") 
      { 
         retV = sa[0]; 
      } 
      for(var i = 1; i < sa.length; i ++) 
      { 
           if(sa[i].substring(0,1) == "u") 
           { 
               retV += Hex2Utf8(Str2Hex(sa[i].substring(1,5))); 
               
           } 
           else retV += "%" + sa[i]; 
      } 
      
      return retV; 
  } 
  function Str2Hex(s) 
  { 
      var c = ""; 
      var n; 
      var ss = "0123456789ABCDEF"; 
      var digS = ""; 
      for(var i = 0; i < s.length; i ++) 
      { 
         c = s.charAt(i); 
         n = ss.indexOf(c); 
         digS += Dec2Dig(eval(n)); 
           
      } 
      //return value; 
      return digS; 
  } 
  function Dec2Dig(n1) 
  { 
      var s = ""; 
      var n2 = 0; 
      for(var i = 0; i < 4; i++) 
      { 
         n2 = Math.pow(2,3 - i); 
         if(n1 >= n2) 
         { 
            s += '1'; 
            n1 = n1 - n2; 
          } 
         else 
          s += '0'; 
          
      } 
      return s; 
      
  } 
  function Dig2Dec(s) 
  { 
      var retV = 0; 
      if(s.length == 4) 
      { 
          for(var i = 0; i < 4; i ++) 
          { 
              retV += eval(s.charAt(i)) * Math.pow(2, 3 - i); 
          } 
          return retV; 
      } 
      return -1; 
  } 
  function Hex2Utf8(s) 
  { 
     var retS = ""; 
     var tempS = ""; 
     var ss = ""; 
     if(s.length == 16) 
     { 
         tempS = "1110" + s.substring(0, 4); 
         tempS += "10" +  s.substring(4, 10); 
         tempS += "10" + s.substring(10,16); 
         var sss = "0123456789ABCDEF"; 
         for(var i = 0; i < 3; i ++) 
         { 
            retS += "%"; 
            ss = tempS.substring(i * 8, (eval(i)+1)*8); 
            
            
            
            retS += sss.charAt(Dig2Dec(ss.substring(0,4))); 
            retS += sss.charAt(Dig2Dec(ss.substring(4,8))); 
         } 
         return retS; 
     } 
     return ""; 
  } 

  不过,这样编码转换只是针对IE浏览器,如果在firefox下也这样操作会出现乱码的。无奈,需要添加一个浏览器类型的判断。 以上是我自己的理解,有经验的朋友欢迎交流。

3
0
分享到:
评论
1 楼 glyustb 2010-11-04  
很欣赏楼主的博客标题啊,同感同感

相关推荐

    option属性的js事件浏览器差异

    在W3C标准中,它作为参数传递给事件处理函数,而在IE中,它可以通过`window.event`访问。为兼容处理,可以这样做: ```javascript option.onchange = function(event) { event = event || window.event; // ...

    浏览器调用本地EXE,试用于谷歌浏览器

    这个方法的灵活性在于,一旦注册表配置正确,只需一次设置,就能让浏览器根据需要调用不同的.exe文件,只需要传递不同的参数即可。 标签“浏览器调EXE”进一步强调了这一技术的核心:浏览器作为触发者,执行本地的...

    setTimeout与setInterval在不同浏览器下的差异

    这种差异主要是由于不同浏览器对 `setTimeout` 参数传递的理解不同。在标准中,`setTimeout` 接收一个函数和一个延迟时间作为参数,但在某些浏览器中,如Firefox,它会尝试将额外的参数传递给指定的函数。IE和Opera...

    支持多浏览器的JS日期控件

    因此,创建跨浏览器的日期控件时,需要考虑这些差异并进行适当的兼容性处理。 接着,我们讨论如何设计日期控件的界面。常见的实现方式是使用HTML和CSS创建一个包含日历图标的按钮,当用户点击该按钮时,弹出一个...

    浏览器兼容问题处理

    - IE支持`window.event`,Firefox则需要在事件处理函数中传递`event`参数。解决方法是在事件处理函数中添加`event`参数,并检查是否存在`window.event`。 9. **坐标获取**: - IE使用`event.x`和`event.y`,Fire...

    jsp使用URL编码传递中文参数问题.doc

    5. **浏览器兼容性**:不同的浏览器对URL编码和解码的处理可能存在差异,因此在处理中文参数时,需要确保代码兼容主流浏览器,例如Chrome、Firefox、Safari和IE等。 6. **最佳实践**:为了避免编码问题,一种好的...

    详解参数传递四种形式

    2. **超链接参数传递**:超链接也是通过URL传递参数,但用户点击链接时,浏览器会发起一个新的HTTP请求,携带链接中的参数。在示例中,`超链接传递参数&lt;/a&gt;`,当点击此链接时,会跳转至指定页面并传递`id`和`name`。...

    css和js的浏览器兼容问题汇总

    此外,`window.event`在事件处理中是IE特有的,而Firefox中事件对象必须通过事件处理函数的参数传递。在处理事件时,为兼容IE和Firefox,可以编写如下的通用事件处理函数: ```javascript function Submitted(event...

    javascript 跨浏览器的事件系统

    在IE中,回调函数的this指向可能与标准不一致,且事件对象并非作为回调函数的第一个参数自动传递。这导致在IE中处理事件需要额外的注意。 文章作者司徒正美通过封装这些原生函数,提供了一种兼容不同浏览器的方法。...

    微信分享(html5兼容所有的移动端浏览器)

    4. **适配各种移动端浏览器**:尽管HTML5提供了强大的跨平台兼容性,但不同的浏览器对某些API的实现可能存在差异。因此,我们需要进行详细的浏览器检测,并根据不同的情况提供相应的解决方案。例如,某些老版本的...

    关于javaScript注册click大事传递参数的不胜利问题_.docx

    通过这样的方式,我们可以确保事件处理函数在任何浏览器中都能正确地接收和使用传递的参数。这种方法在处理复杂的业务逻辑,尤其是在涉及多个条件和权限判断的场景下,非常有用。它使得JavaScript代码更加灵活,同时...

    jQuery-dayin调用浏览器打印

    jQuery-dayin插件可能还提供了一些可配置的选项,如自定义打印样式、排除某些元素不打印等,这些可以通过传递参数到dayin()方法中来实现。 值得注意的是,虽然jQuery-dayin尽力提供了一致的打印体验,但并非所有...

    IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别实例分析

    在使用Ajax进行数据传递时,不同的浏览器对于中文字符的处理方式可能会有差异,尤其是IE和Firefox(FF)这两款广泛使用的浏览器。中文字符编码问题主要发生在字符编码不一致的情况下,比如浏览器界面的编码为UTF-8,...

    AJAX技术使用XMLHttpRequest对象传递参数的中文乱码问题

    2. **浏览器差异**:不同的浏览器(如IE与Firefox)对于字符编码的默认处理方式可能存在差异,这会导致相同的代码在不同浏览器中运行时出现不同的结果。 3. **请求头设置**:`XMLHttpRequest`发送请求时,如果没有...

    js在IE与firefox的差异集锦

    在IE中可以通过event对象的clientX和clientY属性来获取鼠标位置,而在Firefox中需要将事件对象作为参数传递给事件处理函数,并通过pageX和pageY属性来获取鼠标位置。 6. DIV等元素的边界问题: 不同浏览器在解析CSS...

    浏览器兼容问题

    在IE浏览器中,事件对象可以直接通过`window.event`获取,而在Firefox及其他遵循W3C标准的浏览器中,事件对象作为函数参数传递。因此,为了实现跨浏览器的兼容性,我们需要使用如下代码来获取事件对象: ```...

    WEB 浏览器兼容 推荐收藏

    3. **`window.event`问题**:在Firefox中,`window.event`无法直接使用,需要将事件作为参数传递给函数,如`onMouseMove = "functionName(event)"`,然后在函数内部处理。 4. **对象ID作为对象名问题**:在Firefox...

    JS事件冒泡浏览器兼容

    JavaScript事件冒泡是Web开发中的一个关键概念,它涉及到用户与网页交互时事件的传递机制。在浏览器环境中,事件冒泡是指事件从最深的节点开始,然后逐级向上层节点传播事件的过程。这个过程允许事件处理函数在不同...

    浏览器兼容总结.txt

    这段代码首先检查是否有`evt`参数传递过来,如果没有,则尝试从`window.event`获取事件对象。 #### 五、鼠标坐标位置 在获取鼠标坐标位置时,IE 和 Firefox 也有所不同。IE 使用`event.x`和`event.y`,而 Firefox ...

Global site tag (gtag.js) - Google Analytics