Javascript,encodeURI 无法编码圆括号“(”

问题描述 投票:0回答:5

我的 cookie 值包含圆括号“例如:demo (1)” 当我尝试使用 encodeURI 进行编码时,圆括号 ( 未编码为 %28 ,对圆括号等特殊字符进行编码的替代方法是什么

javascript uri encoder
5个回答
15
投票

要将 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


10
投票

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()
不会编码:~!*()'


4
投票

基于 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()}`
  );
}

3
投票

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;
}

0
投票

就我而言,这个自定义函数有效

function customEncode(str) {
    return encodeURIComponent(str)
        .replace(/[!'()*]/g, function(c) {
            return '%' + c.charCodeAt(0).toString(16);
        })
        .replace(/%25/g, '%'); // Replace %25 with %
}
© www.soinside.com 2019 - 2024. All rights reserved.