【发布时间】:2019-06-03 08:00:16
【问题描述】:
我将 Java 11 与具有最新 JSP/JSTL 的 Tomcat 9 结合使用。我正在 Windows 10 上的 Chrome 71 和 Firefox 64.0 中进行测试。我有以下测试文档:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8"/>
<title>Hello</title>
</head>
<body>
<c:if test="${not empty param.fullName}">
<p>Hello, ${param.fullName}.</p>
</c:if>
<form>
<div>
<label>Full name: <input name="fullName" /></label>
</div>
<button>Say Hello</button>
</form>
</body>
</html>
这可能是最简单的形式。如您所知,method 表单默认为get,action 表单默认为""(提交到同一页面),enctype 表单默认为application/x-www-form-urlencoded。
如果我在字段中输入名称“Flávio José”(巴西著名的 forró 歌手和音乐家)并提交,则表单将通过 HTTP GET 提交到使用 hello.jsp?fullName=Fl%C3%A1vio+Jos%C3%A9 的同一页面。这是正确的,页面显示:
Hello, Flávio José.
如果我将表单 method 更改为 post 并输入相同的名称“Flávio José”,则表单内容将通过 POST 提交,并带有 HTTP 请求内容:
fullName=Fl%C3%A1vio+Jos%C3%A9
这看起来也是正确的。但这次页面显示:
Hello, Flávio José.
JSP 似乎认为这些是一系列 ISO-8859-1 八位字节(或代码页 1252 八位字节),而不是将 %C3%A 视为一个 UTF-8 八位字节序列,因此将它们解码为错误字符序列。
但是它从哪里获得 ISO-8859-1?我的 JSP 页面缺少什么来指示正确的编码?
我还要注意WHATWG specification 表示application/x-www-form-urlencoded 八位字节默认应被解析为 UTF-8。 Java servlet 规范是否被破坏了?我该如何解决这个问题?
【问题讨论】:
-
HTTP请求的Content-Type是否指定了字符集?
标签: java forms jsp tomcat servlets