javascript转义的替代品?

javascript转义的替代品?,javascript,encoding,escaping,mailto,Javascript,Encoding,Escaping,Mailto,我知道该函数已被弃用,您应该改用encodeURI或encodeURIComponent。但是,encodeUri和encodeUri组件与escape的功能不同 我想用javascript和瑞典语创建一个mailto链接。下面是escape、encodeURIComponent和encodeURI之间的比较: var subject=“åäö”; var body=“bodyåäö”; console.log(“mailto:?subject=“+escape(subject)+”和body

我知道该函数已被弃用,您应该改用encodeURI或encodeURIComponent。但是,encodeUri和encodeUri组件与escape的功能不同

我想用javascript和瑞典语创建一个mailto链接。下面是escape、encodeURIComponent和encodeURI之间的比较:

var subject=“åäö”;
var body=“bodyåäö”;
console.log(“mailto:?subject=“+escape(subject)+”和body=“+escape(body));
log(“mailto:?subject=“+encodeURIComponent(subject)+”和body=“+encodeURIComponent(body));
log(“mailto:?subject=“+encodeURI(subject)+”&body=“+encodeURI(body))JavaScript版本1.5中不推荐使用escape()函数。使用或代替

范例

string:            "May/June 2016, Volume 72, Issue 3"
escape:            "May/June%202016%2C%20Volume%2072%2C%20Issue%203"
encodeURI:         "May/June%202016,%20Volume%2072,%20Issue%203"
encodeURIComponent:"May%2FJune%202016%2C%20Volume%2072%2C%20Issue%203"
source

escape()
在第节中定义,并说明:

。。。本附录中规定的所有语言特征和行为都有一个或多个不良特征,如果没有遗留用法,则将从本规范中删除

对于代码单位值为0xFF或以下的字符,
escape()
生成两位转义序列:
%xx
。这基本上意味着,
escape()
将仅包含
U+0000
U+00FF
的字符的字符串转换为使用拉丁-1编码的百分比编码字符串

对于代码单位较大的字符,使用四位格式
%uxxx
。在
mailto:
-URI(如中所定义)的
hfields
部分(存储主题和正文)中不允许这样做:

无保留的
pct编码的
定义如下:

仅当百分号后跟两个六位数字时才允许使用百分号,不允许百分号后跟
u

使用与
escape
行为完全相同的自实现版本并不能解决任何问题-只需继续使用
escape
,它不会很快被删除



总结一下:如果所有字符都在
U+0000
U+00FF
的范围内,则先前使用的
escape()
生成了1%的编码邮件URI,否则生成了无效的URI(如果某些应用程序考虑了javascript编码/解码兼容性,则可能仍能正确解释此URI)

使用
encodeURIComponent()
(不要使用
encodeURI()
,它不会逃逸
/
,…)生成UTF8%编码的mailto URI更为正确(没有创建无效URI的风险),也更为经得起未来的考验。在许多地方需要使用UTF-8(但允许对“MIME编码的单词和合成电子邮件中的正文”进行其他编码)

例如:

text_拉丁语1=“瑞典语”
text_other=“Emoji直接引用

此函数主要用于URL查询(URL后面的部分?)-而不是转义普通字符串文字,后者使用“\xHH”格式(HH是两个十六进制数字,格式\xHH\xHH用于更高平面的Unicode字符)

您遇到的问题是因为
escape()
不支持UTF-8,而
encodeURI()
encodeURIComponent()不支持UTF-8

但要绝对清楚永远不要使用
encodeURI()
encodeURIComponent()
。让我们试试看:


console.log(encodeURIComponent(“@#*”);
您使用的是什么编码,您是否尝试过使用
utf-8
?我使用的是utf-8编码。我现在注意到escape在Firefox中不起作用,所以我必须在Firefox中使用encodeURIComponent。Firefox中的错误:\u Error\u非法\u值:组件返回失败代码:0x80070057(NS\u错误\u非法\u值)[nsIDOMLocation.href]我提出的最好的解决方案是定义我自己的escape函数,而不是使用不推荐使用的函数。下面是一个如何实现escape函数的示例:这两个函数与escape做的事情不同。问题甚至指出了这一点。而且,W3学校不是一个很好的链接资源。
s='a?b/ce“f'g';console.log(escape(s)、encodeURI(s)、encodeURI(s)、EncodeComponent(s))#=>a%3Fb/c%3Cd%3Ee%22f%27g a?b/c%3Cd%3Ee%3Ee%22f'g
,在Chrome 74.0.3729.169(64位)的测试中,只有escape可以正确防止XSS(不可能转义引号属性)在Windows 10上,只有UTF-8链接可以产生正确的unicode字符,而另一个链接则会产生未确定的字符(�) 或者只是保留了%hex转义码字符串。@如果指定了浏览器,您过去会单击链接,但这样做与浏览器无关。但是,结果取决于在解释
mailto:
-links时打开的邮件客户端。因此,如果您可以指定哪个邮件客户端是可操作的,那就太好了ned,当您单击链接时。如果链接在浏览器中打开了一个新选项卡,则表示Web邮件服务注册为
mailto:
-handler。在这种情况下,请指定使用哪个Web邮件服务。(gmail.com或outlook.com或roundcube或…?)我想说的是,我使用的是一个基于浏览器的邮件客户端,因此在这种情况下,浏览器的行为和URI的初始解释肯定是相关的。为了进一步解释,mailto URI是在Firefox 67中生成并单击的,Firefox 67打开了Chrome。无论如何,浏览器都不是无关的,因为这都是关于生成correc的在浏览器中没有链接,因此在生成URI到将其传递给mailto客户端之间,我想也存在对浏览器的依赖。仅供参考,我确认Thunderbird正确解释了UTF-8和mime单词URI。
mailtoURI    = "mailto:" [ to ] [ hfields ]
to           = addr-spec *("," addr-spec )
hfields      = "?" hfield *( "&" hfield )
hfield       = hfname "=" hfvalue
hfname       = *qchar
hfvalue      = *qchar
...
qchar        = unreserved / pct-encoded / some-delims
some-delims  = "!" / "$" / "'" / "(" / ")" / "*"
               / "+" / "," / ";" / ":" / "@"
unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG