我对文件名进行编码,并将其作为URL的一部分发送,例如/rest/get?name=Filename.txt
。在JavaScript中,链接构建非常简单。
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 中,结果可以正常使用。
为什么会得到不同的结果?
是否是 Firefox 中 encodeURIComponent()
的一个错误?
Firefox 是否使用不同的编码方式进行 encodeURIComponent()
?
更新。 我找到了类似的问题(encodeURIComponent 在中国各浏览器中表现不同 [搜索] 和 encodeURIComponent 在浏览器和 ä-ö-å 字符中的差异 [äöå]),但都没有答案。
更新2。 进一步调查发现以下字符被编码方式有所不同,并在服务器上导致“文件未找到”异常:
- 你好
- æøåÆØÅäöüïëêîâéíáóúýñ
- ½§¤
- £€
%3F
是?
,所以看起来它没有正确理解 Unicode。 - James Thorpe你好
,它仍然失败。 - naXa stands with Ukraine