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

the*_*ses 2 java unicode servlets 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
Run Code Online (Sandbox Code Playgroud)

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

由于我没有得到正确的值,所以如果我尝试在我的 servlet 类中使用

URLDecoder.decode(myString, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

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

विषय वस�त�
Run Code Online (Sandbox Code Playgroud)

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

bob*_*nce 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")

有关背景,请参阅此问题