如何在servlet中处理编码的unicode文本?

我正在从外部源访问我的servlet URL。 其中一个参数是印地文文本。 外部源正在编码它。 编码值是。

%E0%A4%AA%E0%A4%BE%E0%A4%A0%E0%A5%8D%E0%A4%AF%20%E0%A4%AD%E0%A4%BE%E0%A4%97 

我可以通过wireshark在TCP转储中看到它。 但我没有在servlet应用程序中获取此编码字符串。 我试图通过getParameter()方法得到它。 它返回一些随机字符。

因为我没有得到正确的值,所以如果我尝试使用我的servlet类解码它

 URLDecoder.decode(myString, "UTF-8"); 

然后它返回一些随机字符,像这样 –

 विषय वसॠतॠ 

请建议我如何在servlet中读取此编码文本并解码回原始值。

我试图通过getParameter()方法得到它。

一般来说,Servlet中的getParameter和输入编码的处理都是破坏的。 无论你是否想要,你都会获得ISO-8559-1(而且你通常不会)。

您可以解决此问题,并通过以下方式获取UTF-8查询字符串参数:

  1. 特定于容器的配置选项(例如Tomcat URIEncoding )。

  2. 抓取原始request.getQueryString()并手动将其片段传递给URLDecoder.decode(..., "utf-8") ,而不是依赖于getParameter 。 只有当你采用这条路线时,你才需要自己担心URLDecoder

  3. 通过将错误值编码回原来的字节(使用ISO-8859-1)然后将其解码为UTF-8,例如new String(request.getParameter("param").getBytes("iso-8859-1"), "utf-8") )来修复getParameter输出的错误解码new String(request.getParameter("param").getBytes("iso-8859-1"), "utf-8")

有关背景,请参阅此问题 。

我试过这个:

 try { System.out.println(URLDecoder.decode("%E0%A4%AA%E0%A4%BE%E0%A4%A0%E0%A5%8D%E0%A4%AF%20%E0%A4%AD%E0%A4%BE%E0%A4%97", "UTF-8")); } catch (Exception e) { e.printStackTrace(); } 

……它适用于我,印地语人物,没有exception抛出。

确保您的控制台以UTF-8输出,它可能采用不同的编码方式。

编辑

在Eclipse中:

运行配置……

“Commmon”标签

编码

[选择UTF-8]

编辑二

processRequest中的HttpServlet类中的示例代码:

 response.setContentType("text/html;charset=UTF-8"); String argument = request.getParameter("argument"); String decoded; if (argument != null) { decoded = URLDecoder.decode(argument, "UTF-8"); } else { decoded = "null"; } PrintWriter out = response.getWriter(); try { out.println(""); out.println(""); out.println(""); out.println("Servlet TestServlet"); out.println(""); out.println(""); out.println("

The argument's value is: " + decoded + "

"); out.println(""); out.println(""); } finally { out.close(); }

输出:

截图