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

时间:2013-06-20 11:24:33

标签: java servlets unicode urldecode

我正在从外部来源访问我的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中读取此编码文本并解码回原始值。

2 个答案:

答案 0 :(得分:2)

  

我试图通过getParameter()方法获取它。

getParameter并且通常会破坏Servlet中输入编码的处理。无论你是否愿意,你都会得到ISO-8559-1(而且你通常不会)。

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

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

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

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

  4. 请参阅this question了解背景信息。

答案 1 :(得分:0)

我试过这个:

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();
}

......它适用于我,印地语人物,没有异常抛出。

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

修改

在Eclipse中:

运行

运行配置...

“Commmon”标签

编码

[选择UTF-8]

编辑II

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

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("<!DOCTYPE html>");
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Servlet TestServlet</title>");            
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>The argument's value is: " + decoded + "</h1>");
    out.println("</body>");
    out.println("</html>");
} finally {            
    out.close();
}

输出:

Screenshot