9

我的一位同事创建了一个基本的联系我们类型的表单,它是重音字符(è、é、à 等)。我们在 Struts 1 上使用 KonaKart 一个 Java 电子商务平台。

我已将问题缩小到通过 HttpServletRequest 对象传入的数据。比较一个类似(正常运行)的表单,我注意到在旧表单上,请求对象的字符编码request.getCharacterEncoding()request.getParameter()已经被破坏了。

除此之外,我没有发现已知良好形式和新旧形式之间有任何显着差异。

我已经排除的事情:

  • 两个 HTML 页面都有标签:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  • HTML 中的两个表单标签都使用 POST,并且不设置编码
  • 从 Firebug 检查,Request 和 Response 标头都具有相同的属性
  • <%@page contentType="text/html;charset=UTF-8" language="java" %>两个 JSP 页面在标记中使用相同的属性
  • *Form.java 文件中没有任何有趣的事情发生,它们都继承自 BaseValidatorForm
  • 我检查了源文件编码,它们都设置为默认 - 继承自 Container: UTF-8

如果我将它们从 ISO-8859-1 转换为 UTF-8,效果很好,但我更愿意找出核心问题。例如:new String(request.getParameter("firstName").getBytes("ISO-8859-1"),"UTF8")

欢迎任何建议,我完全没有想法。

4

2 回答 2

15

现代浏览器通常不在 HTTP 请求Content-Type标头中提供字符编码。Content-Type这是在基于 HTML 表单的应用程序的情况下,但是与为带有表单的页面提供服务的初始 HTTP 响应的标头中指定的相同字符编码。您需要自己将请求字符编码显式设置为相同的编码,在您的情况下为 UTF-8。

request.setCharacterEncoding("UTF-8");

在从请求中检索任何请求参数之前执行此操作(否则为时已​​晚;然后将使用服务器平台默认编码来解析参数,这实际上通常是 ISO-8859-1)。映射的servlet 过滤器/*是一个完美的地方。

也可以看看:

于 2012-09-10T19:25:13.157 回答
0

request.getCharacterEncoding()依赖于Content-Type请求属性,而不是Accept-Charset

因此application/x-www-form-urlencoded;charset=IS08859_1应该适用于 POST 操作。该<%@page标签不会影响 POST 数据。

于 2012-09-10T19:26:31.937 回答