请求参数中+号的密码

+ 号的秘密:
   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 ,程序才能正常处理)
   


问题解决:

思路1:
    1.  要想正常传输+ 号而不被转义为空格,需要进行进行编码为%2B 。查了下几个编码函数,发现只有encodeURIComponent 才会对+ 号进行编码处理。
    2. encodeURIComponent 默认为采用UTF-8 字符集,理论上只需要在原先的请求中添加_input_charset=utf-8(由 pipeline 中的SetLocaleValve 进行解析) ,就可以得到正确的 e+h 变送器。 
    
    在实施过程中,发现结果并不是预期的那样。 客户端通过js encode 后,在服务端解析后一直是乱码。 查了下byte ,发现服务端一直是用GBK 在进行解析, 针对变送器的UTF-8 编码的byte 为{-27,-113,-104,-23,-128,-127} ,客户端用GBK 解析后变为{-27.-113.- 104.-23,-63,-63} ,针对最后两byte 因为字符不可见,导致全部被替换为-63 。网上查了下,针对 utf-8 -> gbk -> utf-8 在一定情况下就会出现该问题(http://lingqi1818.iteye.com/blog/348953 ) 

原文地址:https://www.cnblogs.com/ceshizhilu/p/9002629.html