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#replaceAllres.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() 编码解码

encodeURI 和 encodeURIComponent 区别

在JavaScript编码URL不编码&