如何在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查询字符串参数:
-
特定于容器的配置选项(例如Tomcat
URIEncoding
)。 -
抓取原始
request.getQueryString()
并手动将其片段传递给URLDecoder.decode(..., "utf-8")
,而不是依赖于getParameter
。 只有当你采用这条路线时,你才需要自己担心URLDecoder
。 -
通过将错误值编码回原来的字节(使用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(); }
输出: