Yas*_*jaj 9 html java forms jsp utf-8
我已经访问了HTML中关于UTF-8编码的每一个问题,似乎没有任何东西像预期的那样工作.
我添加了meta标签:没有改变.
我添加了accept-charset属性form:没有改变.
<%@ 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>
Run Code Online (Sandbox Code Playgroud)
for (int i = 0 ; i < 2; i++){
System.out.println(request.getParameter("line"+i));
}
Run Code Online (Sandbox Code Playgroud)
Et ton père et sa soeur
Il ne sera jamais parti.
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 31
我添加了
meta标签:没有改变.
当通过HTTP而不是例如从本地磁盘文件系统(即,页面的URL http://...而不是例如file://...)提供页面时,它确实没有任何效果.在HTTP中,将使用HTTP响应头中的字符集.您已将其设置如下:
<%@page pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)
这不仅会使用UTF-8写出HTTP响应,还会charset在Content-Type响应头中设置该属性.

webbrowser将使用这个来解释响应并编码任何HTML表单参数.
我添加了
accept-charset属性form:没有改变.
它仅在Microsoft Internet Explorer浏览器中有效.即便如此,它也是错误地做错了.永远不要使用它.所有真正的Web浏览器都将使用响应标头中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>
Run Code Online (Sandbox Code Playgroud)
如上所述,这将告诉JSP引擎使用UTF-8编写HTTP响应输出,并将其设置在HTTP响应头中.在发送回服务器之前,webbrowser将使用相同的字符集对HTTP请求参数进行编码.
您唯一缺少的一步是告诉服务器在返回getParameterXxx()调用之前必须使用UTF-8解码HTTP请求参数.全局如何取决于HTTP请求方法.鉴于您正在使用POST方法,使用以下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.
}
}
Run Code Online (Sandbox Code Playgroud)
就这样.在Servlet 3.0+(Tomcat 7及更高版本)中,您不需要其他web.xml配置.
您只需要记住,在使用任何方法首次获取POST请求参数之前setCharacterEncoding()调用方法非常重要.这是因为它们在首次访问时只解析一次,然后缓存在服务器内存中.getParameterXxx()
所以例如以下序列是错误的:
String foo = request.getParameter("foo"); // Wrong encoding.
// ...
request.setCharacterEncoding("UTF-8"); // Attempt to set it.
String bar = request.getParameter("bar"); // STILL wrong encoding!
Run Code Online (Sandbox Code Playgroud)
这样做的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,那么将窗口>首选项>常规>工作空间>文本文件编码设置为UTF-8就可以了.
首先让我说一下普遍的事实,我们都知道计算机除了比特之外什么都不懂 - 0和1.
现在,当您通过HTTP提交HTML表单并且值通过线路传输到达目标服务器时,基本上会有很多位 - 0和1被传递.
对此的类比可以是 - 我正在给你发一封信,告诉你它是用英文,法文还是荷兰语写的,这样你就可以得到我打算寄给你的确切信息.在回复我的同时,你还会提到我应该阅读的语言.
重要的是,当数据离开客户端时,它将被编码,同样将在服务器端解码,反之亦然.如果您没有指定任何内容,那么在从客户端到服务器端之前,将按照application/x-www-form-urlencoded对内容进行编码.
阅读热身非常重要.您需要确保获得预期结果.
为了确保这一点,有几种方式可以讨论,但我会说使用HTTP Accept-Charset请求标头字段.根据您提供的代码段,您已经使用并正确使用它,因此您可以从这方面做得很好.
有些人会说不使用它或者没有实现,但我会非常谦卑地反对他们.Accept-Charset是HTTP 1.1规范的一部分(我提供了链接),实现HTTP 1.1的浏览器将实现相同的功能.他们也可能会争辩说使用Accept request-header字段的 "charset"属性
我向您提供所有数据和事实,而不仅仅是单词,但如果您不满意,请使用不同的浏览器进行以下测试.
accept-charset="ISO-8859-1"为HTML表单和POST/GET表单,其中包含中文或高级法语字符到服务器.您将看到,您无法在服务器上看到预期的字符.但是,如果您将使用相同的编码方案,那么您将看到预期的字符.因此,浏览器确实实现了accept-charset它的效果.
你可以通过很多方式来实现这一目标(有时可能需要根据具体情况进行一些配置,但下面解决了95%的情况并且对你的情况也有好处).例如:
setCharacterEncoding上的请求和响应-Dfile.encoding=utf8等更多在这里 我最喜欢的是第一个也将解决您的问题 - "字符编码过滤器",原因如下:
您可以执行以下操作来实现自己的字符编码过滤器.如果您正在使用某些类似Springs等的框架,那么您不需要编写自己的类,而只需在web.xml中进行配置
下面的核心逻辑非常类似于Spring所做的,除了很多依赖,他们做的bean意识到的事情.
web.xml(配置)
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>
com.sks.hagrawal.EncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
EncodingFilter(字符编码实现类)
public class EncodingFilter implements Filter {
private String encoding = "UTF-8";
private boolean forceEncoding = false;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
if(forceEncoding){ //If force encoding is set then it means that set response stream encoding as well ...
response.setCharacterEncoding(encoding);
}
filterChain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
String encodingParam = filterConfig.getInitParameter("encoding");
String forceEncoding = filterConfig.getInitParameter("forceEncoding");
if (encodingParam != null) {
encoding = encodingParam;
}
if (forceEncoding != null) {
this.forceEncoding = Boolean.valueOf(forceEncoding);
}
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud)
这与在字符编码过滤器中完成的代码基本相同,但不是在过滤器中进行,而是在servlet或控制器类中进行.
request.setCharacterEncoding("UTF-8");在您开始读取http请求流之前,Idea再次用于设置http请求流的编码.
尝试下面的代码,你会看到,如果你没有使用某种过滤器来设置请求对象的编码,那么第一个日志将为NULL,而第二个日志将为"UTF-8".
System.out.println("CharacterEncoding = " + request.getCharacterEncoding());
request.setCharacterEncoding("UTF-8");
System.out.println("CharacterEncoding = " + request.getCharacterEncoding());
Run Code Online (Sandbox Code Playgroud)
以下是setCharacterEncoding Java文档的重要摘录.另一件需要注意的事情是你应该提供一个有效的编码方案,否则你会得到UnsupportedEncodingException
覆盖此请求正文中使用的字符编码的名称.必须在读取请求参数或使用getReader()读取输入之前调用此方法.否则,它没有任何效果.
无论何时需要,我都尽力为您提供官方链接或StackOverflow接受的赏金答案,以便您建立信任.
| 归档时间: |
|
| 查看次数: |
24165 次 |
| 最近记录: |