【问题标题】:How can I tell Tomcat to use UTF-8 internally?如何告诉 Tomcat 在内部使用 UTF-8?
【发布时间】:2014-05-27 12:29:45
【问题描述】:

所以我有这个非常简单的 html 文件:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<form method="post" action="formpost.do" accept-charset="utf-8">
    <label for="id">Your name please:</label>
    <input id="id" type="text" name="name"/>
    <input type="submit"/>
</form>
</body>
</html>

还有 output.jsp:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<%= request.getAttribute("name") %>
</body>
</html>

当我在表单中键入“ğğğ”时,我在 output.jsp 中看到了预期的“ğğğ”。处理此表单的 Servlet 如下所示:

@Override
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {

    httpServletResponse.setCharacterEncoding("UTF-8");
    httpServletRequest.setCharacterEncoding("UTF-8");

    String name = httpServletRequest.getParameter("name");
    httpServletRequest.setAttribute("name",name);

    PrintWriter printWriter = new PrintWriter(new File("C:/text.txt"));
    printWriter.write(name);
    printWriter.flush();
    printWriter.close();

    httpServletRequest.getRequestDispatcher("/output.jsp")
            .forward(httpServletRequest, httpServletResponse);
}

问题是,在 text.txt 文件中我会看到“???”而不是“ğğğ”。我一直在尝试解决这个问题好几个小时,但没有运气..

我有

JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8

在 Windows 环境变量中,但据我所知,它没有任何改变。

当我调试这个应用程序时,如果它有帮助的话,变量“name”在调试器窗口中被视为“ğğğ”。

那么我怎样才能让 System.out 打印正确的字符呢?

编辑 1 当我创建一个单独的 Java 项目并简单地运行时:

public static void main(String[] args)
        throws Exception {
    PrintWriter printWriter = new PrintWriter(new File("C:/text.txt"));
    printWriter.write("ğğğ");
    printWriter.flush();
    printWriter.close();
}

文本文件中的所有内容都符合预期。

编辑 2 我的 server.xml 中已经有:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" URIEncoding="UTF-8"/>

【问题讨论】:

  • 您使用什么来“查看 txt.file” - 您可能没有将该文件读取为 UTF-8 格式?
  • @MTilsted 请查看我的编辑。

标签: java jsp tomcat utf-8 character-encoding


【解决方案1】:

UTF-8 问题可能很棘手。但在 Ubuntu 上的 Tomcat 6 中,我以这种方式处理它。首先找到server.xml 文件并打开它进行编辑。我喜欢使用nano,但你应该使用任何你觉得舒服的编辑器:

sudo nano /etc/tomcat6/server.xml

现在寻找&lt;Connector… 的片段并将URIEncoding="UTF-8" 放入其中。在我的一个设置中,它看起来像这样:

<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           URIEncoding="UTF-8"
           redirectPort="8443" />

【讨论】:

    【解决方案2】:

    在这种情况下,您可能需要在 server.xml 中设置连接器,如下所示:

    <Connector URIEncoding="UTF-8/>
    

    当然,你应该在连接器中设置你需要的任何其他属性

    【讨论】:

      【解决方案3】:

      我认为这不是 Tomcat 问题。这是您如何写入文件的 Java 问题。

      书写时使用合适的字符集。

      PrintWriter printWriter = new PrintWriter(new File("C:/text.txt"), "UTF-8");
      

      显然还有阅读。

      【讨论】:

      • 当我简单地编译和运行一个只有一个 main 方法的 java 类时,为什么不需要这个?那为什么一切都好?以及如何将其应用于 System.out.println()?
      • @KorayTugay 启动 Tomcat 的 Java 进程可能使用不同的默认字符集启动。至于System.out,我必须检查,但我认为它也使用默认值。
      • @KorayTugay 是的,System 类使用PrintStream 初始化,该PrintStream 使用从名为sun.stdout.encoding 的系统属性检索到的字符编码。这些是 JVM 初始化的属性。
      • 感谢您提供的重要信息。那我可以让Tomcat以utf-8开头吗?因为目前 System.out.println 也不能打印正确的字符,这很重要。
      • @KorayTugay -Dfile.encoding=UTF-8注意-)VM 参数应该足够了。不要在 Windows 环境属性中设置它,而是打开您的 catalina.batstartup.bat,找到构造 Java 命令的位置,然后将其添加到那里。
      【解决方案4】:

      不知怎的,我让它工作了。

      这是我拥有的 JSP 文件:

      <!DOCTYPE HTML>
      <html lang="en">
      <head>
          <meta charset="utf-8"/>
      </head>
      <body>
      <form accept-charset="UTF-8" action="postform.do" method="post">
          <label>
              <input type="text" name="name"/>
          </label>
          <input type="submit" name="submit" value="Post!">
      </form>
      </body>
      </html>
      

      和 servlet:

      @Override
      protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
              throws ServletException, IOException {
          httpServletResponse.setCharacterEncoding("utf-8");
          httpServletResponse.setContentType("text/html");
          httpServletRequest.setCharacterEncoding("utf-8");
          final String name = httpServletRequest.getParameter("name");
          System.out.println(name);
          final PrintWriter writer = httpServletResponse.getWriter();
          writer.print(name);
          writer.flush();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-06
        • 1970-01-01
        • 2013-06-04
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 2012-08-16
        相关资源
        最近更新 更多