当前位置: 首页 > 面试题库 >

为什么encodeURIComponent不编码单引号/撇号?

马嘉勋
2023-03-14
问题内容

逃生() 函数,已被废弃,取而代之 encodeURIComponent方法 ,但 encodeURIComponent方法
不编码单引号/单引号字符。我需要使用AJAX格式来避免姓氏(例如“ O’Neill”)中的撇号。他们为什么要消除他们试图改善的东西的能力?

编辑:

因此,这是一个代码示例,可以更彻底地说明问题。因此,您可以看到姓“
O’Neill”包含一个撇号,当在url中传递变量时需要将其转义。但这也会在表格的其他地方发生,例如,如果输入的地址是“ Billy’s Tavern”。

<input id='surname' value="O'Neill">                        
<script>
var get_url = '?surname='+encodeURIComponent($('#surname').val());
$.ajax({
    url: get_url
});
</script>

我当前的解决方案,使用自定义函数。我的问题只是问为什么需要自定义功能。

<script>
function customEncodeURIComponent(URI) {
    return encodeURIComponent(URI).replace(/'/g, "%27");
}
</script>

<input id='surname' value="O'Neill">
<script>
var get_url = '?surname='+customEncodeURIComponent($('#surname').val());
$.ajax({
    url: get_url
});
</script>

问题答案:

encodeURIComponent 转义除以下字符外的所有字符:

字母,十进制数字-_。!〜*’()

如果您希望使用兼容的编码与RFC 3986(其中储备!'(),和*),您可以使用:

function rfc3986EncodeURIComponent (str) {  
    return encodeURIComponent(str).replace(/[!'()*]/g, escape);  
}

您可以在MDN上获取更多信息。

更新:

要回答您的问题,关于为什么'上面提到的其他字符以及为什么不是由encodeURIComponent编码的,简短的回答是它们只需要在某些URI方案中进行编码,对它们进行编码的决定取决于您使用的方案。

引用RFC 3986:

产生URI的应用程序应该对与中的字符相对应的数据八位字节进行百分比编码,reserved set除非URI方案明确允许这些字符表示该组件中的数据。如果在URI组件中找到了保留字符,并且该字符没有定界角色,则必须将其解释为代表与该字符的US-
ASCII编码相对应的数据八位位组。

其中“保留集”定义为

reserved    = gen-delims / sub-delims
gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
            / "*" / "+" / "," / ";" / "="

撇号在sub- delims组中。换句话说,如果您确定使用的应用程序会知道如何处理这些字符,则必须特别避免对这些字符进行编码:例如,如果您错误地编码?并且&它们将不再分隔查询部分。历史上也有建议使用;和分隔的路径段参数,(并没有被广泛采用),因此仍然允许使用这些字符。并不是说撇号unreserved在URI数据中是“免费使用”(即),而是假定它在URI上下文中将具有某些特殊含义,例如segment

segment       = *pchar
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"


 类似资料:
  • 本文向大家介绍xml 撇号和引号,包括了xml 撇号和引号的使用技巧和注意事项,需要的朋友参考一下 示例 属性值可以用单引号或双引号出现。适当的字符必须转义。            

  • 问题内容: 以下两个查询给出完全不同的结果的原因是什么? 我已经在Google周围搜索了反引号和撇号(又称为单引号)之间的区别,但是我找不到任何迹象表明为什么对于像上列这样的列名它们会有不同的解释。 难道实际上不是将后一个查询中的单引号字符串解释为列名,而是解释为任意字符串文字,可以说其为“ 1”吗?如果是这样,要找到任何有关撇号含义的页面并不容易。 问题答案: “价格”(撇号或引号)是一个字符串

  • 问题内容: 如中所述,HTML中的单引号什么时候变得如此流行?和Jquery在attribute中嵌入引号, HTML上的Wikipedia条目表示以下内容: 当单引号字符(’)用于引用属性值时,当它出现在属性值本身中时,也必须转为或(不应与XHTML文档中的字符一样转义)。 为什么不应该使用?另外,可以安全地使用它吗? 问题答案: 在有效HTML4实体]的正式列表中,但不是。 从C.16起。命名

  • 我遇到过许多用单撇号表示的Rust类型: 那个撇号的意义是什么?可能是引用的修饰符(

  • 问题内容: 因此,我有一个名为Save.php的文件。 它需要两件事:一个文件和新内容。 您可以通过发送类似的请求来使用它。 ..但当然是对网址进行编码。:)为了简化和可读性,我不做任何编码。 该文件有效,但不是内容。 ..我发现.. .. 当稍后通过XHR获取JSON文件时尝试使用时,当然会抛出错误。 要保存内容,我只用.. 我该怎么做才能消除反斜线? 问题答案: 关闭在php.ini关闭。

  • 问题内容: 这是适合此描述的命令行示例: 我已经尝试过'(不转义),URL编码(在另一端没有urldecoded!)和”(引号消失!),但没有成功。 问题答案: 如果您将“替换为Unicode编码的”(\ u0027),则可以使用: 奇怪,但是值得知道!