encodeURIComponent()的不同行为仅适用于Firefox

naX*_*aXa 9 javascript firefox url-encoding encodeuricomponent

我编码一个文件名并将其作为URL的一部分发送/rest/get?name=Filename.txt.在JS链接构建就像一样简单

url = '/rest/get?name=' + window.encodeURIComponent(file.name);
Run Code Online (Sandbox Code Playgroud)

它适用于简单的情况,但对于硬核测试,我使用一个名为的文件

??abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§!#¤%&()=`@£$€{[]}+´¨^~'-_,;.txt
Run Code Online (Sandbox Code Playgroud)

在URI编码后,我希望得到一个链接

/rest/get?name=%E4%BD%A0%E5%A5%BDabcABC%C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85%C3%A4%C3%B6%C3%BC%C3%AF%C3%AB%C3%AA%C3%AE%C3%A2%C3%A9%C3%AD%C3%A1%C3%B3%C3%BA%C3%BD%C3%B1%C2%BD%C2%A7%3F%3FabcABC%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD!%23%C2%A4%25%26()%3D%60%40%C2%A3%24%E2%82%AC%7B%5B%5D%7D%2B%C2%B4%C2%A8%5E~%27-_%2C%3B.txt
Run Code Online (Sandbox Code Playgroud)

我明白了 构建的链接在最新版本的IE和Chrome中正常工作,但在Firefox中失败.经过一番调查后我发现在Firefox中encodeURIcomponent工作方式不同.这是Firefox中的实际结果:

/rest/get?name=%3F%3FabcABC%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD!%23%EF%BF%BD%25%26%28%29%3D%60%40%EF%BF%BD%24%3F{[]}%2B%EF%BF%BD%EF%BF%BD^~%27-_%2C%3B.txt
Run Code Online (Sandbox Code Playgroud)

视觉比较(Chrome链接位于左侧,Firefox链接位于右侧):

对照

我还尝试将有效链接(在Chrome中构建)复制并粘贴到Firefox,它可以正常工作.

为什么我会得到不同的结果?
我不喜欢 使用不同的编码吗??e?n?c?o?d?e?U?R?I?c?o?m?p?o?n?e?n?t?(?)?̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶
encodeURIComponent()

UPD.我发现了类似的问题(encodeURIComponent在中国的浏览器中表现不同,因为位置 [搜索]和 encodeURIComponent与浏览器和ä-å-å字符 [äöå]的区别),两者都没有答案.

UPD.2进一步调查显示,以下字符的编码方式不同,导致服务器上出现"文件未找到"异常:

  • 你好
  • æøåÆØÅäöüïëêîâéíáóúýñ
  • ½§¤
  • £€

Edu*_*rch 1

我想你的问题不是encodeURIComponent()方法。它是任何构造的编码file.name。延伸你的问题。是如何file.name初始化的?字符从哪里来?