2

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

4

2 回答 2

5

我正在尝试通过 getParameter() 方法获取它。

getParameterServlet 中输入编码的处理通常被破坏。无论您是否愿意,您都会获得 ISO-8559-1(而且您通常不会)。

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

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

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

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

有关背景,请参阅此问题

于 2013-06-20T14:10:43.893 回答
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 中:

运行配置...

“常用”选项卡

编码

[选择 UTF-8]

编辑二

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

输出:

截屏

于 2013-06-20T11:39:05.957 回答