我遇到了一个关于错误 URI 编码的奇怪问题,不胜感激!
该项目使用 JSP、Servlet、Jquery、Tomcat 6。
JSP 中的字符集设置为 UTF-8,所有 Tomcat 连接器都使用 URIEncoding=UTF-8,并且我还使用此处描述的字符编码过滤器。此外,我在元标记中设置了 contentType,我的浏览器正确检测到它。
在使用 Jquery 的 Ajax 调用中,我在我想用作 URL 参数的术语上使用 encodeURIComponent(),然后使用 $.param() 序列化整个参数集。在被调用的 servlet 中,这些参数使用 Java.net.URLDecoder.decode(term, "UTF-8") 正确解码。
在某些地方,我从 JSP 中的参数映射生成 href 元素的 URL。每个参数值在 JSP 端使用 Java.net.URLEncoder.encode(value, "UTF-8") 进行编码,但随后以与之前相同的方式对其进行解码会导致特殊字符损坏。相反,我必须在 JSP 中将其编码为“ISO-8859-2”,然后在 servlet 中将其正确解码为“UTF-8”。
一个澄清的例子:术语“überfall”是通过Javascript(%C3%BCberfall)进行URIEncoded并发送到servlet进行解码和处理,这是有效的。将其传递回 JSP 后,我会将其编码为 UTF-8 并构建 URL,例如:
<a href="/myWebapp/servletPath?term=%C3%BCberfall">Click here</a>
但是,单击此链接会将参数作为“%C3%83%C2%BCberfall”发送到解码为“überfall”的 servlet。当不进行编码时也会发生同样的情况。
当使用“ISO-8859-2”进行编码时,我得到:
<a href="/myWebapp/servletPath?term=%FCberfall">Click here</a>
单击此链接时,我可以在 Wireshark 中观察到 %C3%BCberfall 作为参数发送,该参数再次解码为“überfall”!
谁能告诉我我错过了什么?
编辑:在 Firebug 中观察网络选项卡时,我意识到通过使用
$.param({term : encodeURIComponent(term)});
该术语被 UTF-8 编码两次,导致“%25C3%25BCberfall”,即百分比符号也是百分比编码的。类似地,如果我对参数映射中的每个值调用 encode(term, "UTF-8") 两次,它对我有用。
编码一次而不解码字符串会再次导致“überfall”。