我有一段相当标准的javascript/XHR拖放文件上传代码,但最近遇到了一个不幸的实际问题。我在桌面(Win7)上有一个名为“TEST-é-TEST.txt”的文件。在Chrome(30.0.1599.69)中,它以UTF-8的文件名传输到服务器,这样就没问题了。但是在Firefox(24.0)中,当它到达服务器时,文件名似乎被破坏了。
我不信任Firebug/Chrome告诉我的编码,所以我查看了请求数据包的十六进制代码。除了非ASCII字符在两个浏览器中确实被编码不同之外,其他一切都相同:
这是Firefox的一个bug吗?我尝试将文件重命名,将é替换为ó,但Firefox十六进制值仍然相同...所以这种混淆看起来确实像是浏览器的bug。(例如,如果Firefox混淆地发送ISO-8859-1而没有进行处理,我会看到E9字节,我可以在服务器端处理它,但它不应该被混淆!)
无论原因是什么,是否有任何客户端或服务器端可以纠正这个问题?如果确实发送了替换字符到服务器,那么它似乎无法恢复,所以我几乎肯定需要在客户端上进行处理。
是的,存在此代码的页面具有charset=utf-8,并且Firefox确认它在View>Character Encoding下感知页面为UTF-8。
此外,如果我将文件名转储到console.log中,它看起来很好-我猜它只是在/之后混淆了setRequestHeader("X-File-Name",file.name)。
最后,setRequestHeader()传递的值应该能够具有U+00FF以下的代码点,因此U+00E9(é)和U+00F3(ó)不应该引起问题,尽管更高的代码可能会触发SyntaxError:http://www.w3.org/TR/XMLHttpRequest2/#the-setrequestheader-method。
我不信任Firebug/Chrome告诉我的编码,所以我查看了请求数据包的十六进制代码。除了非ASCII字符在两个浏览器中确实被编码不同之外,其他一切都相同:
Chrome: C3 A9 (this is the expected UTF-8 for that character)
Firefox: EF BF BD (UTF-8 "replacement character"?!)
这是Firefox的一个bug吗?我尝试将文件重命名,将é替换为ó,但Firefox十六进制值仍然相同...所以这种混淆看起来确实像是浏览器的bug。(例如,如果Firefox混淆地发送ISO-8859-1而没有进行处理,我会看到E9字节,我可以在服务器端处理它,但它不应该被混淆!)
无论原因是什么,是否有任何客户端或服务器端可以纠正这个问题?如果确实发送了替换字符到服务器,那么它似乎无法恢复,所以我几乎肯定需要在客户端上进行处理。
是的,存在此代码的页面具有charset=utf-8,并且Firefox确认它在View>Character Encoding下感知页面为UTF-8。
此外,如果我将文件名转储到console.log中,它看起来很好-我猜它只是在/之后混淆了setRequestHeader("X-File-Name",file.name)。
最后,setRequestHeader()传递的值应该能够具有U+00FF以下的代码点,因此U+00E9(é)和U+00F3(ó)不应该引起问题,尽管更高的代码可能会触发SyntaxError:http://www.w3.org/TR/XMLHttpRequest2/#the-setrequestheader-method。