zoukankan      html  css  js  c++  java
  • URI 中特殊字符处理


    一、问题阐述

      今天写 url 请求时,不管是get 请求还是 post 请求,如果参数中带有 + % # 等特殊符号,就无法正常获得参数

      具体现象就是 用URL传参数的时候,用&符号连接,如果某一个参数中含"#$ ^ & * + ="这些符号的时候,在另一个页面getParameter就会取不到传过来的参数。

    二、解决方法

      有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了

      1)下面列出了一些URL特殊符号及编码十六进制值

    • +    URL 中+号表示空格             %2B 
    • 空格 URL中的空格可以用+号或者编码 %20 
    •  /    分隔目录和子目录  %2F   
    • ?     分隔实际的 URL 和参数 %3F 
    • %   指定特殊字符 %25 
    • #    表示书签 %23 
    • &    URL 中指定的参数间的分隔符 %26 
    • =    URL 中指定参数的值 %3D

       2)java 实现

        如果代码采用java 来访问请求的话,可以采用 URLEncoder.encode(param,"utf-8") 将参数值编码,对应的解码方法为URLEncoder.decode()

        java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s); 

        比如     

    1
    String str = "http://localhost:8980/select?param=" + URLEncoder.encode("bcpuser$userid$1#3#4","utf-8") ; <br>//得到结果  http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234

        得到url 可以直接在浏览器上访问,如果后台采用的java+ springMVC,可以直接得到预期的参数(无需再次解码的)

      3)C# 实现

      C#中编码的主要方法:HttpUtility.UrlEncode (不推荐)、Server.UrlEncode (不推荐)、Uri.EscapeUriString、Uri.EscapeDataString。(更多详情,看参考)

    1
    2
    String str = "http://localhost:8980/select?param=" + Uri.EscapeDataString("bcpuser$userid$1#3#4");
    //得到结果  http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234

      

      4) javascript 实现方法

      javascript中的编码有三种方法:escape (不推荐,对ASCII符号正确编码)、encodeURI、encodeURIComponent

      encodeURI:用于对网址编码(不包含参数)

        encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

        encodeURI就是为这个而设计的。encodeURI不对URI中的特殊字符进行编码,如冒号(:)、斜杠(/)。下面看个示例:

    1
    2
    encodeURI("http://www.cnblogs.com/a file with spaces.html")
    // outputs http://www.cnblogs.com/a%20file%20with%20spaces.html

        可以看到仅仅把空格替换成了20%,所以此方法可用于对网址进行编码。

        由于encodeURI不对冒号(:)、斜杠(/)进行编码,所以如果参数(如把网址作为参数)中包含冒号(:)、斜杠(/),就会解析出错,所以此方法不能对参数进行编码。

       encodeURIComponent:用于对网址参数进行编码

        encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

        可以看到此方法对:/都进行了编码,所以不能用它来对网址进行编码。由于此方法对中文,空格,井号(#),斜线(/),冒号(:)都进行了编码,所以适合对URI中的参数进行编码。看下面的示例:

    1
    2
    3
    var param="博客园";
    var url="http://www.cnblogs.com/?key="+encodeURIComponent(param)+"&page=1";
    console.log(url);//outputs http://www.cnblogs.com/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1

     三、总结

      这里我并没有写的很详细,只是达到了我的目的,故暂时记录这么多。

      因为问题出现传递的参数里包含特殊符号而导致参数获取错误,故这里在url 拼接参数的时候,将参数的值编码后传递即可(原理如此,不限语言)

    参考博客:http://www.cnblogs.com/kissdodog/archive/2013/04/22/3035907.html

    ,"utf-8") 

  • 相关阅读:
    如何让背景图片全屏显示
    浅谈图片如何在页面中居中显示
    clientHeight、offsetHeight 区别 笔记
    使用Flexible实现手淘H5页面的终端适配
    max(min)-device-width和max(min)-width的区别
    HTML5 meta最全使用手册
    常见浏览器兼容性问题与解决方案
    响应式设计的性能优化(转)
    移动H5前端性能优化指南
    SQL Server Profiler使用方法
  • 原文地址:https://www.cnblogs.com/jpfss/p/10233721.html
Copyright © 2011-2022 走看看