我正在从外部来源访问我的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中读取此编码文本并解码回原始值。
答案 0 :(得分:2)
我试图通过getParameter()方法获取它。
getParameter
并且通常会破坏Servlet中输入编码的处理。无论你是否愿意,你都会得到ISO-8559-1(而且你通常不会)。
您可以解决此问题,并通过以下方式获取UTF-8查询字符串参数:
特定于容器的配置选项(例如Tomcat URIEncoding
)。
抓取原始request.getQueryString()
并手动将其片段传递到URLDecoder.decode(..., "utf-8")
,而不是依赖getParameter
。只有当你走这条路时,你才需要担心自己URLDecoder
。
通过将错误值编码回原来的字节(使用ISO-8859-1)然后将其解码为UTF-8来修复getParameter
输出的错误解码,例如new String(request.getParameter("param").getBytes("iso-8859-1"), "utf-8")
。
请参阅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();
}
输出: