gpt4 book ai didi

java - HTML : Form does not send UTF-8 format inputs

转载 作者:行者123 更新时间:2023-11-28 23:14:35 25 4
gpt4 key购买 nike

我已经访问了有关 HTML 中的 UTF-8 编码的每一个问题,但似乎没有任何问题使其按预期工作。

我添加了 meta 标签:没有任何改变。
我在 form 中添加了 accept-charset 属性:没有任何变化。


JSP文件

<%@ page pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Editer les sous-titres</title>
</head>
<body>
<form method="post" action="/Subtitlor/edit" accept-charset="UTF-8">
<h3 name="nameOfFile"><c:out value="${ nameOfFile }"/></h3>
<input type="hidden" name="nameOfFile" id="nameOfFile" value="${ nameOfFile }"/>
<c:if test="${ !saved }">
<input value ="Enregistrer le travail" type="submit" style="position:fixed; top: 10px; right: 10px;" />
</c:if>
<a href="/Subtitlor/" style="position:fixed; top: 50px; right: 10px;">Retour à la page d'accueil</a>
<c:if test="${ saved }">
<div style="position:fixed; top: 90px; right: 10px;">
<c:out value="Travail enregistré dans la base de donnée"/>
</div>
</c:if>
<table border="1">
<c:if test="${ !saved }">
<thead>
<th style="weight:bold">Original Line</th>
<th style="weight:bold">Translation</th>
<th style="weight:bold">Already translated</th>
</thead>
</c:if>
<c:forEach items="${ subtitles }" var="line" varStatus="status">
<tr>
<td style="text-align:right;"><c:out value="${ line }" /></td>
<td><input type="text" name="line${ status.index }" id="line${ status.index }" size="35" /></td>
<td style="text-align:right"><c:out value="${ lines[status.index].content }"/></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>

小服务程序

for (int i = 0 ; i < 2; i++){
System.out.println(request.getParameter("line"+i));
}

输出

Et ton père et sa soeur
Il ne sera jamais parti.

最佳答案

I added the meta tag : nothing changed.

当页面通过 HTTP 而不是例如来自本地磁盘文件系统(即页面的 URL 是 http://... 而不是例如 file://... )。在 HTTP 中,将使用 HTTP 响应 header 中的字符集。您已经设置如下:

<%@page pageEncoding="UTF-8"%>

这不仅会使用 UTF-8 写出 HTTP 响应,还会设置 charset Content-Type 中的属性响应头。

Web 浏览器将使用它来解释响应并对任何 HTML 表单参数进行编码。


I added the accept-charset attribute in form : nothing changed.

它只在 Microsoft Internet Explorer 浏览器中有效。即使这样,它也是错误的。永远不要使用它。所有真正的网络浏览器将改为使用 charset Content-Type 中指定的属性响应的标题。只要您指定 accept-charset,即使 MSIE 也会以正确的方式进行操作属性。如前所述,您已经通过 pageEncoding 正确设置了它。 .


同时去掉 meta标记和 accept-charset属性。它们没有任何有用的效果,从长远来看它们只会让你自己感到困惑,甚至在最终用户使用 MSIE 时让事情变得更糟。只要坚持 pageEncoding .而不是重复 pageEncoding在所有 JSP 页面上,您还可以在 web.xml 中全局设置它如下:

<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>

如前所述,这将告诉 JSP 引擎使用 UTF-8 编写 HTTP 响应输出,并将其也设置在 HTTP 响应 header 中。在发送回服务器之前,网络浏览器将使用相同的字符集对 HTTP 请求参数进行编码。

您唯一缺少的步骤是告诉服务器它必须使用 UTF-8 在返回 getParameterXxx() 之前解码 HTTP 请求参数。电话。如何全局执行此操作取决于 HTTP 请求方法。鉴于您使用的是 POST 方法,使用以下自动 Hook 所有请求的 servlet 过滤器类可以相对容易地实现这一点:

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {

@Override
public void init(FilterConfig config) throws ServletException {
// NOOP.
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}

@Override
public void destroy() {
// NOOP.
}
}

就是这样。在 Servlet 3.0+(Tomcat 7 和更新版本)中,您不需要额外的 web.xml配置。

您只需要记住,setCharacterEncoding() 非常重要方法被调用之前使用任何getParameterXxx() 首次获取POST 请求参数方法。这是因为它们仅在第一次访问时被解析一次,然后缓存在服务器内存中。

例如下面的顺序是错误的:

String foo = request.getParameter("foo"); // Wrong encoding.
// ...
request.setCharacterEncoding("UTF-8"); // Attempt to set it.
String bar = request.getParameter("bar"); // STILL wrong encoding!

setCharacterEncoding() servlet 过滤器中的作业将保证它及时运行(至少在任何 servlet 之前)。


如果你想指示服务器也使用 UTF-8 解码 GET(不是 POST)请求参数(你知道的那些你在 URL 中的 ? 字符之后看到的参数),那么你基本上需要在服务器端配置它。无法通过 servlet API 对其进行配置。例如,如果您使用 Tomcat 作为服务器,则需要添加 URIEncoding="UTF-8"<Connector> 中的属性Tomcat 自己的元素 /conf/server.xml .

如果您仍然看到 MojibakeSystem.out.println() 的控制台输出中调用,那么 stdout 本身没有配置为使用 UTF-8 的可能性很大。如何做到这一点取决于谁负责解释和呈现标准输出。例如,如果您使用 Eclipse 作为 IDE,则需要将 Window > Preferences > General > Workspace > Text File Encoding 设置为 UTF-8。

另见:

关于java - HTML : Form does not send UTF-8 format inputs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51999092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com