ie下表单提交中文乱码的根源是其对accept-charset属性支持残缺且默认用gbk编码,必须显式设置form标签的accept-charset="utf-8"(全大写),并配合js拦截提交、手动序列化与ajax发送,避免原生submit触发gbk编码。

IE 下表单提交中文乱码,不是后端没设 UTF-8,而是 IE(尤其 IE10/11)在 form 提交时对 accept-charset 属性支持残缺,且默认用系统编码(GBK)编码表单值——哪怕页面是 UTF-8,input 里输的中文也会被按 GBK 发出去。
表单必须显式声明 accept-charset="UTF-8"
IE 忽略 <meta charset="UTF-8"> 和 Content-Type 响应头对表单编码的影响,只认 form 标签上的 accept-charset 属性。
- 所有含中文输入的
form标签都得加上:accept-charset="UTF-8" - 不能写成
accept-charset="utf8"或accept-charset="utf-8"——IE 只识别全大写的"UTF-8" - 如果用 layui 的
form.render()动态生成表单,要在 JS 初始化前就给<form></form>加上该属性,否则渲染后可能丢失
避免用 submit 按钮触发表单原生提交
IE 对 type="submit" 按钮触发的提交行为更“固执”,即使加了 accept-charset,某些嵌套场景下仍会 fallback 到 GBK。更稳的方式是拦截并手动构造请求。
- 给提交按钮加
lay-submit属性,用form.on('submit(filter)')拦截 - 在回调里用
layui.$(this).serialize()获取表单数据(IE 下该方法能正确读取 UTF-8 字符串) - 改用
layui.$.ajax发送 POST,contentType: 'application/x-www-form-urlencoded; charset=UTF-8'显式声明编码 - 记得
return false阻止默认提交,否则 IE 会走两次:一次你发的 AJAX,一次它自己的 GBK 提交
textarea 和 select 的特殊处理
IE 对这两类控件的 value 读取有时会“降级”为系统编码字符串,尤其当内容含全角符号或换行时。
-
textarea提交前手动转义:encodeURIComponent($textarea.val()),后端再decodeURIComponent -
select的option中文文本,IE 可能读错——确保每个<option></option>的value是英文/数字 ID,显示文本用 JS 渲染或后端传参,不依赖 option.innerHTML - 若必须用中文
value,初始化时用encodeURI编码存入,提交时再解码,避免 IE 直接读原始 DOM 值
最常被忽略的是:IE 下 form.serialize() 返回的字符串本身是 UTF-8,但如果你把它拼进 URL 里做 GET 请求,IE 会再次按系统编码 encode 一遍——所以 GET 表单务必改 POST,或者手动对整个 query string 做 encodeURIComponent 包裹。











