传递请求参数为UTF-8编码的字符串[重复](Passing request parameters

2019-06-25 11:07发布

这个问题已经在这里有一个答案:

  • 如何通过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>

Answer 1:

所述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的-如何让人物吧?


Answer 2:

调用的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);
    }
}


Answer 3:

问题是依赖于,使用哪个应用程序服务器。 即使是页面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>


Answer 4:

我最近遇到这个问题来了,不能在这里找到答案。 我使用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


Answer 5:

样品字符编码:

<%@ page language="java" pageEncoding="utf8" contentType="text/html;charset=UTF-8" %>


文章来源: Passing request parameters as UTF-8 encoded strings [duplicate]