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