通过get方式传递某些特殊字符时,不能被正确的处理。比如#字符,在浏览器的处理中会变成注释,从而php端无法正确的拿到参数。
这个时候js会将传递的参数进行编码。
工作中遇到过这样一个需求:
1.有 首页 搜索页 两个页面
2.首页有个快捷搜索框,点击搜索可新打开搜索页并自动填入参数进行搜索
3.搜索页支持来自首页填入差不是故意的搜索和自身页面填入参数的搜索功能
4.若未登录的情况进行搜索,则登录后需要记录url中的搜索参数
未登录情况下首页搜索参数传递过程如下:
->首页输入框填入参数X(encodeURIComponent()编码一样的参数将参数编码)
->PHP判断未登录,记录查询参数(需要写到url中)
->登录完成后跳转到搜索页,并能读取到跟encodeURIComponent()编码一样的参数
问题大体概述为:
js把参数编码后传递给了php,需要php跟js一样的编码方式,在传递回js。需要js和PHP对字符串编码的统一。
JavaScript encodeURIComponent() 函数
encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
PHP以下方法与JS encodeURIComponent() 编码一致:
function encodeURIComponent($str) {
$revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')');
return strtr(rawurlencode($str), $revert);
}
这样就可以实现js编码与PHP编码的一致性。