我的 cookie 值包含圆括号“例如:demo (1)” 当我尝试使用 encodeURI 进行编码时,圆括号 ( 未编码为 %28 ,对圆括号等特殊字符进行编码的替代方法是什么
要将 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
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()
不会编码:~!*()'
基于 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()}`
);
}
encodeURI
仅对保留字符进行编码,因此不应期望此函数对括号进行编码。
您可以编写自己的函数来对字符串中的所有字符进行编码,或者只是创建要编码的自定义字符列表。
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;
}
就我而言,这个自定义函数有效
function customEncode(str) {
return encodeURIComponent(str)
.replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
})
.replace(/%25/g, '%'); // Replace %25 with %
}