我的一位同事创建了一个基本的联系我们类型的表单,它正在处理重音字符(è、é、à 等)。我们在 Struts 1 上使用 KonaKart Java 电子商务平台。
我已将问题缩小到通过 HttpServletRequest 对象传入的数据。比较类似的(正常运行的)表单,我注意到在旧表单上请求对象的字符编码(request.getCharacterEncoding()
)返回为“UTF-8”,但在新表单上它返回为 NULL,文本来自request.getParameter()
已经被破坏了。
除此之外,我还没有发现已知良好的形式和新的和损坏的形式之间的任何显着差异。
我已经排除的事情:
- 两个 HTML 页面都有标签:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- HTML中的两个form标签都使用POST,不设置编码
- 从 Firebug 检查,Request 和 Response header 都具有相同的属性
- 两个 JSP 页面在
<%@page contentType="text/html;charset=UTF-8" language="java" %>
中使用相同的属性标签 - *Form.java 文件中没有任何有趣的事情发生,它们都继承自 BaseValidatorForm
- 我检查了源文件编码,它们都设置为默认 - 从 Container 继承:UTF-8
如果我将它们从 ISO-8859-1 转换为 UTF-8,效果很好,但我更愿意找出核心问题。
例如:new String(request.getParameter("firstName").getBytes("ISO-8859-1"),"UTF8")
欢迎任何建议,我完全没有想法。
最佳答案
现代浏览器通常不在 HTTP 请求 Content-Type
header 中提供字符编码。这是在基于 HTML 表单的应用程序的情况下,但是与为页面提供表单的初始 HTTP 响应的 Content-Type
header 中指定的字符编码相同。您需要自己明确地将请求字符编码设置为相同的编码,在您的情况下是 UTF-8。
request.setCharacterEncoding("UTF-8");
在从请求中检索到任何请求参数之前执行此操作(否则为时已晚;然后将使用服务器平台默认编码来解析参数,这通常是 ISO-8859- 1). servlet filter映射到 /*
上的是一个完美的地方。
另见:
关于java - request.getCharacterEncoding() 返回 NULL... 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12358101/