前天做搜索是遇到在搜索框中 有加号 到结果页加号就不见了于是在网上查了一番 结果如下:

html中因为一些非标准的做法,将+等同于空格进行处理(当Html的表单被提交时, 每个表单域都会被Url编码之后才在被发送。由于历史的原因,表单使用的Url编码实现并不符合最新的标准。例如对于空格使用的编码并不是%20,而是+号,如果表单使用的是Post方法提交的,我们可以在HTTP头中看到有一个Content-Type的header,值为 application/x-www-form-urlencoded,大部分应用程序均能处理这种非标准实现的Url编码)。
在搜索引擎中做了下尝试: 
keyword = e h变送器 , url =http://www.google.cn/search?hl=zh-CN&newwindow=1&q=e+h变送器 (空格被转化为+号)
keyword = e+ h变送器 , url = http://www.google.cn/search?hl=zh-CN&newwindow=1&q=e%2Bh变送器 (+号被进行了转义为%2B,程序才能正常处理)

问题解决:

将+ 号进行%2B 的编码。 因为目前JS 中没有现成的函数,这里只是通过replace(/+/g, ‘%2B’) 进行了转化。

一下为拷贝别人的感觉有用就留下了

背景知识:

URIEncoding 和useBodyEncodingForURI

对于URL 提交的数据和表单中GET 方式提交的数据,在接收数据的JSP 中设置request.setCharacterEncoding 参数是不行的, 因为在Tomcat5.0 中,默认情况下使用ISO- 8859-1 对URL 提交的数据和表单中GET 方式提交的数据进行重新编码(解码),而不使用该参数对URL 提交的数据和表单中GET 方式提交的数据进行 重新编码(解码)。要解决该问题,应该在Tomcat 的配置文件的Connector 标签中设置useBodyEncodingForURI 或者 URIEncoding 属性,其中useBodyEncodingForURI 参数表示是否用 request.setCharacterEncoding 参数对URL 提交的数据和表单中GET 方式提交的数据进行重新编码 ,在默认情 况下,该参数为false (Tomcat4.0 中该参数默认为true ); URIEncoding 参数 指定对所有GET 方式请求(包括URL 提交的数据和表单中GET 方式提交的数据)进行统一的重新编码(解码)的编码 。 URIEncoding 和useBodyEncodingForURI 区别是,URIEncoding 是对所有GET 方式的请求的数据进行统一的重新编码 (解码),而useBodyEncodingForURI 则是根据响应该请求的页面的request.setCharacterEncoding 参数对数 据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL 提交的数据和表单中GET 方式提交的数据,可以修改 URIEncoding 参数为浏览器编码或者修改useBodyEncodingForURI 为true ,并且在获得数据的JSP 页面中 request.setCharacterEncoding 参数设置成浏览器编码。

为什么需要Url 编码
1. Url 中有些字符会引起歧义 , =,& 号等
2. Url 的编码格式采用的是ASCII 码,而不是Unicode ,这也就是说你不能在Url 中包含任何非ASCII 字符,例如中文

哪些字符需要编码
RFC3986 文档规定,Url 中只允许包含英文字母(a-zA-Z )、数字(0-9 )、-_.~4 个特殊字符以及所有保留字符。
Url 可以划分成若干个组件,协议、主机、路径等。RFC3986 中指定了以下字符为保留字符: ! * ’ ( ) ; : @ & = + $ , / ? # [ ]

如何对Url 中的非法字符进行编码
Url 编码通常也被称为百分号编码(Url Encoding ,also known as percent-encoding ),是因为它的编码方式非常简单,使用% 百分号加上两位的字符——0123456789ABCDEF—— 代表一个字节的 十六进制形式。Url 编码默认使用的字符集是US-ASCII 。例如a 在US-ASCII 码中对应的字节是0x61 ,那么Url 编码之后得到的就是% 61 ,我们在地址栏上输入http: //g.cn/search?q=%61%62%63,实际上就等同于在google 上搜索abc 了。又如@ 符号在 ASCII 字符集中对应的字节为0x40 ,经过Url 编码之后得到的是%40 。

Javascript 中的escape,encodeURI 和encodeURIComponent 的区别

Javascript 中提供了3 对函数用来对Url 编码以得到合法的Url ,它们分别是escape / unescape,encodeURI / decodeURI 和encodeURIComponent / decodeURIComponent 。解码和编码的过程是可逆的.

  • 兼容性不同
    escape 函数是从Javascript1.0 的时候就存在了,其他两个函数是在Javascript1.5 才引入的。但是由于 Javascript1.5 已经非常普及了,所以实际上使用encodeURI 和encodeURIComponent 并不会有什么兼容性问题。

  • 对Unicode 字符的编码方式不同
    这三个函数对于ASCII 字符的编码方式相同,均是使用百分号+ 两位十六进制字符来表示。但是对于Unicode 字符,escape 的编码方式是% uxxxx ,其中的xxxx 是用来表示unicode 字符的4 位十六进制字符。这种方式已经被W3C 废弃了。但是在ECMA-262 标准中仍然保留着 escape 的这种编码语法。encodeURI 和encodeURIComponent 则使用UTF-8 对非ASCII 字符进行编码,然后再进行百分号 编码。这是RFC 推荐的。因此建议尽可能的使用这两个函数替代escape 进行编码。

  • 适用场合不同
    encodeURI 被用作对一个完整的URI 进行编码,而encodeURIComponent 被用作对URI 的一个组件进行编码。

  • 安全字符不同
    escape (69 个) */@+-._0-9a-zA-Z
    encodeURI (82 个) !#$&’()*+,/:;=?@-._~0-9a-zA-Z
    encodeURIComponent (71 个) !’()*-._~0-9a-zA-Z ( 注意+ 号未在其安全字符里)

  • 其他和Url 编码相关的问题
    对于包含中文的Url 的处理问题,不同浏览器有不同的表现。例如对于IE ,如果你勾选了高级设置“ 总是以UTF-8 发送Url” ,那么Url 中的路径部分 的中文会使用UTF-8 进行Url 编码之后发送给服务端,而查询参数中的中文部分使用系统默认字符集进行Url 编码。为了保证最大互操作性,建议所有放到 Url 中的组件全部显式指定某个字符集进行Url 编码,而不依赖于浏览器的默认实现。

  • 另外,很多HTTP 监视工具或者浏览器地址栏等在显示Url 的时候会自动将Url 进行一次解码(使用UTF-8 字符集),这就是为什么当你在 Firefox 中访问Google 搜索中文的时候,地址栏显示的Url 包含中文的缘故。但实际上发送给服务端的原始Url 还是经过编码的。你可以在地址栏 上使用Javascript 访问location.href 就可以看出来了。在研究Url 编解码的时候千万别被这些假象给迷惑了。

浏览器处理 前台传递的+时出现问题相关推荐

  1. html 仿饿了点餐页面,JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变

    说在前面:必须是基于支持H5的浏览器才可以 这个 API 本身非常简单,由以下三部分组成. document.hidden:表示页面是否隐藏的布尔值.页面隐藏包括 页面在后台标签页中 或者 浏览器最小 ...

  2. 解决JS在url中传递参数时参数包含中文乱码的问题

    解决JS在url中传递参数时参数包含中文乱码的问题 参考文章: (1)解决JS在url中传递参数时参数包含中文乱码的问题 (2)https://www.cnblogs.com/xushengguan/ ...

  3. Intent传递数据时,可以传递哪些类型数据

    Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选) A.Serializable  B.charsequence C.Parcelable  D.Bundle 除了上面的还能传递 ...

  4. UC浏览器电脑版播放视频时出现崩溃怎么解决

    UC浏览器是一款功能强大的电脑浏览器.最近小编看到有用户反映播放视频的时候出现崩溃,这个该怎么解决呢?下面小编就来告诉你. UC浏览器电脑版播放视频时出现崩溃怎么解决 UC浏览器电脑版播放视频时出现崩 ...

  5. List对象集合的遍历、对象赋值和向前台传递

    List对象集合的遍历.对象赋值和向前台传递 在前几天的编程过程中,发现前台需要的数据不完整.从数据库查出来的字段不够,如果再多表联查或者左联会有我不想要的重复数据,而且会使SQL更加复杂,不利于维护 ...

  6. 在给函数传递实参时,不能对用到引用的传NULL

    在给函数传递实参时,不能对用到引用的传NULL FillRetBuff(buff,1024*1000,NULL,&paramElem); 在声明时为  int FillRetBuff(char ...

  7. webservice传递特殊字符时的解决的方法

    webservice传递特殊字符时的解决的方法 参考文章: (1)webservice传递特殊字符时的解决的方法 (2)https://www.cnblogs.com/yxwkf/p/3856354. ...

  8. 解决默写浏览器中点击input输入框时,placeholder的值不消失的方法

    解决默写浏览器中点击input输入框时,placeholder的值不消失的方法 参考文章: (1)解决默写浏览器中点击input输入框时,placeholder的值不消失的方法 (2)https:// ...

  9. java获取前台值_SpringMVC接收前台传递过来的值的实例

    之前控制器方法获得前台传来的值有三种方式: 1.通过HttpServletRequest: @RequestMapping(value="/index1") public Stri ...

  10. html字体外围有黄色边框,input或textarea在chrome、safari浏览器点击获得焦点时出现黄色边框去掉的方法...

    1.input或textarea在chrome.safari浏览器点击获得焦点时出现黄色边框去掉的方法 input{ outline:0;} outline 定义和用法 outline (轮廓)是绘制 ...

最新文章

  1. 校园音乐点歌平台的设计与开发 微信小程序 推荐点歌 java 开发
  2. Kali Linux 2019.4发布了!解决Kali Linux 2019.4中文乱码问题
  3. 银行核心海量数据无损迁移:TDSQL数据库多源异构迁移方案
  4. 初学ActionScript 3.0(一):Hello World
  5. “约见”面试官系列之常见面试题之第七十九篇之ES5和ES6(建议收藏)
  6. 配置mysql环境变量
  7. J-flash 烧写cc2538教程
  8. 掌握JS压缩图片,这一篇就够了
  9. 【zookeeper】Zookeeper:ZooInspector界面工具
  10. dataframe切片_Kaggle:识别淋巴结病理切片有无癌细胞(logistic+svm+rf+CNN)
  11. 黑马程序员---java基础------------------基础中的基础学习
  12. 同样是OpenJDK8,有的平台需要libpng12,有的不需要
  13. 解决Tomcat乱码
  14. Linux系统下强制删除文件
  15. 网页的短信与邮箱注册
  16. 【js获取当天时间0点和23点59分59秒】
  17. 田忌赛马 - 动态规划
  18. java日期 国际化_java中国际化的时间处理
  19. vivos9桌面字体样式怎样修改
  20. origin 双Y轴堆积条形图

热门文章

  1. Tableau Desktop 2021中文免费版下载(包含其它历史版本)
  2. 【离散数学】相关概念_01
  3. 股票历史数据-股票数据下载
  4. Camunda工作流引擎入门
  5. UE4 视差毛发材质
  6. Keil使用命令行附加预定义宏编译
  7. R语言查看某个R包版本号
  8. 新概念单片机c语言 pdf,新概念51单片机C语言教程实例代码(1).pdf
  9. OpenGL超级宝典(第7版)之第九章片段处理与帧缓冲
  10. WebGrid Enterprise免费下载