这个问题已经在这里有一个答案:
- 如何通过Unicode字符作为JSP / Servlet的用request.getParameter? 4个回答
我创建一个简单的登录页面,我想通过登录名和密码参数UTF-8编码字符串。 正如你可以在下面的代码中看到,第一行是我设置编码成UTF-8,但似乎这是毫无意义的,因为它不工作。 当我使用登录名和密码参数与口音的结果页面收到奇怪的字符。
如何正确设置字符编码,在所有浏览器的方法吗?
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My Page</title>
</head>
<body>
<h1>Welcome to My Page</h1>
<form name="login" action="login.jsp" method="POST">
Login:<br/>
<input type="text" name="login" value="" /><br/>
Password:<br/>
<input type="password" name="password" value="" /><br/>
<br/>
<input type="submit" value="Login" /><br/>
</form>
</body>
</html>
所述pageEncoding
仅设置响应的字符编码和charset
的HTTP的属性Content-Type
首部。 基本上,它告诉服务器将其发送到客户端之前由JSP生产为UTF-8字符解码和报头通知客户端使用UTF-8来编码它们,并且还使用它时在非常相同的页中的任何形式是提交回服务器。 该contentType
已经默认为text/html
,所以下面就足够了:
<%@page pageEncoding="UTF-8"%>
当页面都通过HTTP的HTML meta标签被忽略。 它当页面是保存在本地磁盘系统中的HTML文件的客户端, 然后通过打开唯一被用来file://
URI在浏览器中。
在特定情况下,HTTP请求正文编码显然是没有被设定为UTF-8。 请求体编码需要由被设置ServletRequest#setCharacterEncoding()
在servlet或在第一次呼叫之前的过滤器request.getXxx()
中所涉及的任何请求servlet或过滤器被做过。
request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");
// ...
也可以看看:
- 如何设置请求编码在Tomcat中?
- 为什么POST不兑现字符集,而是一个AJAX请求呢? Tomcat的6
- https://stackoverflow.com/questions/14177914/passing-turkish-char-from-form-to-java-class-with-struts2/
- Unicode的-如何让人物吧?
调用的ServletRequest#的setCharacterEncoding()仍然会失败在某些情况下。
如果你的容器认真遵循Servlet规范(一样的Tomcat),这将是解释后参数默认为ISO-8859-1。 这可能断章取义UTF-8字符(如日本最近我工作过的情况下),他们曾经得到你的代码之前,特别是如果你有一个Servlet过滤器与检查的请求参数getParameter()
或getParameters()
这两种方法强制参数进行解码,解码只做过一次。
这里有一个链接,如何解决这个问题在Tomcat中,如果你有过滤器,看看请求参数。 乡亲们将要检查的文档其特定的容器。
http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1
从键位是:
加
useBodyEncodingForURI="true" URIEncoding="UTF-8"
在Tomcat的server.xml中Context元素,并添加
<filter>
<filter-name>Character Encoding Filter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Character Encoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
作为调用的getParameter()或getParameters()在web.xml任何滤波器之前。 我发现,虽然上面的链接,使这两个属性的上下文元素看起来像替代的useBodyEncodingForURI一个是绝对必要的或者tomcat会不会为查询字符串编码。 从Request.java在tomcat的7.0.42:
boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
if (enc != null) {
parameters.setEncoding(enc);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding(enc);
}
} else {
parameters.setEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
}
}
问题是依赖于,使用哪个应用程序服务器。 即使是页面correcty设置好的如为UTF8,试图获得正确的形式(按预期语言)参数没有给出好的结果,即用request.getParameter(...)返回不期望的人物,因为参数的默认代码页大多8859-1。 这意味着,对于参数的代码页是独立于JSP页面和默认代码页的代码页参数影响的结果。 最好的说明,我发现是在这里: [1]:http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/URI_Encoding 。 在一些应用程序服务器“request.setCharacterEncoding(...)”没有效果。 您必须在描述符中设置参数编码。 最复杂的是JBoss和Apache Tomcat上,在中间是Glassfish的。 更好的是WebLogic中,最好的是码头(UTF-8为默认设置)。 在我来说,我必须创建与GlassFish web.xml描述,并把那里参数编码标签。 在我的情况(GlassFish的):
<glassfish-web-app error-url="">
<!-- request.setCharacterEncoding("UTF-8") not functioning -->
<parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
我最近遇到这个问题来了,不能在这里找到答案。 我使用WebLogic和大多数解决方案都为Tomcat。
对于编码与WebLogic配合工作,你必须把这个你weblogic.xml
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name>UTF-8</java-charset-name>
</input-charset>
</charset-params>
来源: weblogic.xml中的文档
注:我也有这些选项在我的_JAVA_OPTIONS,但不知道他们是否是必要的。
-Dweblogic.webservice.i18n.charset=utf-8
-Dfile.encoding=UTF-8
样品字符编码:
<%@ page language="java" pageEncoding="utf8" contentType="text/html;charset=UTF-8" %>