【问题标题】:How to read right a utf-8 string in the serlvet? [duplicate]如何正确读取 serlvet 中的 utf-8 字符串? [复制]
【发布时间】:2015-07-17 15:49:40
【问题描述】:

在您将我的问题标记为与this 问题重复之前,我想说我已阅读它以及此post

但是,我做错了,我继续以错误的格式从我的 jsp 中的表单中读取数据(使用 POST 方法)。我做了什么:

1.在我的 JSP 中,我把这个

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

在标题中这个&lt;meta charset="UTF-8"&gt;

2.在servlet中

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //...        
        //code
        //...

        request.setCharacterEncoding("UTF-8");

        /*if (request.getCharacterEncoding() == null) {
                request.setCharacterEncoding("UTF-8");
         }
       */
       //...
       //code
       //...

       s1 = request.getParameter(kname1); //<-here I read the value from the JSP and get finally this ÎÏδÏÎ±Î´Î±Ï 

}

3. 在 web.xml 我有&lt;?xml version="1.0" encoding="UTF-8"?&gt;

我在这里错过了什么??

【问题讨论】:

  • 试试这个:s1 = new String(request.getParameter(kname1).getBytes(),"utf-8");
  • 也打印这个:request.getParameter(kname1).getBytes();,那么你可以从字节中找出问题所在。 (删除if (request.getCharacterEncoding() == null) { request.setCharacterEncoding("UTF-8"); }
  • 您要发布表格吗? kname1 应该在正文中还是在查询字符串中?
  • @SotiriosDelimanolis kname1 是一个字符串变量。我正在尝试阅读一个希腊词... @nafas 我有一点改进。从这个 ÎÏδÏÎ±Î´Î±Ï 现在我得到 α�?δα�?δ 。在日志中我得到 [B@24803429
  • 我问它是从哪里来的?

标签: java jsp servlets encoding utf-8


【解决方案1】:

HTML 是否正确?

您似乎在使用 HTML5

<%@page contentType="text/html" pageEncoding="UTF-8" language="java"
%><!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>...</title>
  </head>
  <body>
    <form accept-charset="UTF-8" ...>
    ...
  </body>
</html>

表单标签中的指示允许将未转义的 UTF-8 输入发送到服务器。否则你可能会得到&amp;#8085; 或类似的东西。 (好像不是这样的。)

你可能会检查一些东西,比如

<input name="test" type="hidden" value="\u0109ĉ">

应该给"ĉĉ"

使用 POST 和 GET 方法的表单之间存在差异,现在在固定编码功能之前检查它们。

在服务器中的请求编码?

检查request.getCharacterEncoding() == null。 否则某些过滤器可能会干扰。编码的设置只能在最初进行。也许 servlet 被转发到,或者其他什么。

转换可能发生在任何地方,尤其是在查看文本时。所以尽可能纯粹地转储请求参数:

String s = request.getParameter("test");
for (char ch : s.toCharArray()) {
    printf("\\u%04x ", 0xFFFF & (int)ch);
}
println();

【讨论】:

  • 我创建了一个过滤器,它起作用了。
  • 元字符集和表单接受字符集在通过 HTTP 提供的 HTML 页面中毫无意义。由于 OP 使用 JSP/Servlet,因此 OP 很可能使用 HTTP 来提供 HTML 页面。然后,一般理智的 HTTP 客户端将使用 HTTP 响应标头中指定的字符集,而忽略 HTML 中指定的字符集。由于 OP(正确)在 JSP 中使用了 pageEncoding="UTF-8",因此它肯定存在于 HTTP 响应标头中。此外,即使这不存在,表单 accept-charset 也只会被 MSIE 浏览器考虑,即使这样它也做错了(它错误地将 ISO-8859-1 替换为 CP-1252)。永远不要使用它。
  • 所以,对传播这种错误信息投反对票。
  • @BalusC 是的,HTTP 标头会覆盖 HTML 中的元信息。它们仍然有意义,例如在将 HTML 保存在磁盘上时。 ISO-8859-1 (Latin-1) 几乎在每个浏览器中都被理解为 CP-1252 (Windows Latin-1),即使在 Linux 和 Mac 上也是如此。 HTML 5 甚至规定了这种解释。虽然不赞成投票的一个很好的理由是,这似乎是一个重复的问题。而这还不够充分。
猜你喜欢
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多