Javascript,encodeURI 未能编码圆括号“(”
Posted
技术标签:
【中文标题】Javascript,encodeURI 未能编码圆括号“(”【英文标题】:Javascript , encodeURI failed to encode round bracket "(" 【发布时间】:2017-11-09 18:46:30 【问题描述】:我的 cookie 值包含圆括号“例如:演示 (1)” 当我尝试使用 encodeURI 进行编码时,圆括号 ( 未编码为 %28 ,对圆括号等特殊字符进行编码的替代方法是什么
【问题讨论】:
【参考方案1】:基于 Mozilla 的 encodeURIComponent 文档
encodeURIComponent
转义所有字符,除了:A-Z a-z 0-9 - _ . ! ~ * ' ( )
所以,我们不想转义的唯一字符是:A-Z a-z 0-9
。
所以这个函数做到了:
function encodeUriAll(value)
return value.replace(/[^A-Za-z0-9]/g, c =>
`%$c.charCodeAt(0).toString(16).toUpperCase()`
);
【讨论】:
【参考方案2】:encodeURI()
编码特殊字符,除了: , / ? :@&=+$#。
可以使用encodeURIComponent()
对上述字符进行编码。
您可以编写自定义方法来编码(到 %28。
例子:
var uri = "my test.asp?(name";
var res = encodeURI(uri);
res.replace("(", "%28");
正如下面评论中所指出的,string#replace
将删除第一个匹配项,可以使用 string#replaceAll
即 res.replaceAll("(", "%28")
或 string#replace
与全局标志即 res.replace(/\(/g, "%28")
删除所有匹配项。
const uri = "my test.asp?(n(a(m(e",
res = encodeURI(uri);
console.log(res.replaceAll("(", "%28"));
注意:
encodeURI()
不会编码:~!@#$&*()=:/,;?+'
encodeURIComponent()
不会编码:~!*()'
【讨论】:
即使 encodeURIComponent() 也没有编码这个字符 w3schools.com/jsref/… 知道.replace() 只会替换“(”的第一个实例。要替换所有实例,请使用正则表达式或.split.join,例如res.replace(/\(/g, "%28")
或res.split("(").join("%28")
跨度>
【参考方案3】:
要将 uri 组件编码为符合 RFC 3986 - 编码字符 !'()*
- 您可以使用:
function fixedEncodeURIComponent(str)
return encodeURIComponent(str).replace(/[!'()*]/g, function(c)
return '%' + c.charCodeAt(0).toString(16);
);
取自前面的示例部分:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/encodeURIComponent
参考见:https://www.rfc-editor.org/rfc/rfc3986
【讨论】:
【参考方案4】:encodeURI
仅对保留字符进行编码,因此不应期望此函数对括号进行编码。
您可以编写自己的函数来对字符串中的所有字符进行编码,或者只是创建要编码的字符的自定义列表。
Fiddle
function superEncodeURI(url)
var encodedStr = '', encodeChars = ["(", ")"];
url = encodeURI(url);
for(var i = 0, len = url.length; i < len; i++)
if (encodeChars.indexOf(url[i]) >= 0)
var hex = parseInt(url.charCodeAt(i)).toString(16);
encodedStr += '%' + hex;
else
encodedStr += url[i];
return encodedStr;
【讨论】:
以上是关于Javascript,encodeURI 未能编码圆括号“(”的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript中有对字符串编码的三个函数:escape,encodeURI,encodeURIComponent
JavaScript中有三个可以对字符串编码的函数,分别是: escape(),encodeURI(),encodeURIComponent()
javascript encodeURI和encodeURIComponent的比较
escape()encodeURI()encodeURIComponent() 编码解码