11

我对文件名进行编码并将其作为 URL 的一部分发送,例如/rest/get?name=Filename.txt. 在 JS 中链接构造很简单

url = '/rest/get?name=' + window.encodeURIComponent(file.name);

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

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

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

我明白了。构建的链接在最新版本的 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

视觉对比(左侧为 Chrome 链接,右侧为 Firefox 链接):

比较

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

为什么我会得到不同的结果?
I̶s̶̶i̶t̶̶a̶̶b̶u̶g̶̶w̶i̶t̶h̶̶̶̶i̶n̶̶F̶i̶r̶e̶f̶o̶x̶ ̶e̶n̶c̶o̶d̶e̶U̶R̶I̶c̶o̶m̶p̶o̶n̶e̶n̶t̶(̶)̶
Firefox 是否使用不同的编码encodeURIComponent()

UPD。我发现了类似的问题(encodeURIComponent 在中国浏览器中的行为与位置[搜索] 和 encodeURIComponent 与浏览器的差异和 ä-ö-å 字符[äöå] 不同),都没有答案。

UPD.2进一步调查表明,以下字符的编码方式不同,并导致服务器上出现“找不到文件”异常:

  • 你好
  • æøåÆØÅäöüïëêîâéíáóúýñ
  • ½§¤
  • 英镑</li>
4

2 回答 2

1

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

于 2016-02-10T05:03:49.493 回答
-1

encodeURIComponent() 是一个本机函数,因此 Firefox 显然在幕后使用了一些不同的实现。

如果你被卡住了,那么只需提供你自己的 encodeURIComponent() 的 JavaScript 实现,那么你会在不同的浏览器中得到相同的结果。这是一个如何获取其开源副本的链接:

encodeURIComponent算法源码

于 2016-02-12T19:22:52.727 回答