HTML表单:在Firefox中将charset与enctype相结合的问题

时间:2009-10-05 21:57:23

标签: html firefox character-encoding enctype

我有一个带留言板的网站。董事会允许人们发布消息并包含附件。我有一个问题,每当有人写一篇非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"

......但这对角色问题没有影响。

有什么方法可以解决这个问题吗?

2 个答案:

答案 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请求测试了这个,效果相同。