我有一个带留言板的网站。董事会允许人们发布消息并包含附件。我有一个问题,每当有人写一篇非Unicode字符的帖子时,我的网站就会出现问题。为了解决这个问题,我从
更改了我的HTML表单代码enctype="multipart/form-data"
(因为我接受文件上传)到:
enctype="multipart/form-data;charset=UTF-8"
这解决了角色问题。但它破坏了Firefox 2到3.5中的文件上传功能。 Firefox接受用户提交的所有文本,但不接受文件数据。它完全像它应该的行为,但好像没有提交文件。在Safari中一切正常。
我也试过
enctype="multipart/form-data" accept-charset="UTF-8"
......但这对角色问题没有影响。
有什么方法可以解决这个问题吗?
答案 0 :(得分:6)
charset
不是multipart/form-data
媒体类型的注册参数。它不应该做任何事情。
根据RFC2388
,提交字段的字符集实际上应该由浏览器在form-data子部分的Content-Type
标头中传递。实际上,没有浏览器可以做到这一点。
accept-charset
无法使用,因为它在IE中被破坏:它不是为提交选择字符集而是实际指定一个替代字符集,在每个字段的基础上,当字符不适合primary charset(这是当前页面的charset)。这有效地破坏了你的字符串,因为你无法找到IE实际使用的字符集。
让浏览器以UTF-8的形式提交表单的唯一有效方法是通过设置Content-Type: text/html;charset=utf-8
标头(包括<meta>
HTTP等效项来提供包含表单为UTF-8的页面或两者兼而有(如果用户将页面保存到光盘,丢失标题信息,则可能是个好主意。)
答案 1 :(得分:5)
问题不是表单数据,而是文件名字段 - 如果你需要utf-8
和文件数据,这根本不起作用,所以如果你需要在服务器上处理文件名,这是常见的,你搞砸了。
如果您在表单中设置enctype="multipart/form-data;charset=UTF-8"
,Tomcat 6会将其转换为:内容类型:application/x-www-form-urlencoded
,这就是问题所在。
我花了很长时间来追踪这一点,但看起来它一般都被破坏了,我已经用来自网络浏览器和.Net的HTTP请求测试了这个,效果相同。