破碎的UTF-8编码的URI JSP中(Broken UTF-8 URI Encoding in J

2019-10-17 00:45发布

我有一个奇怪的问题与错误的URI编码,并希望得到任何帮助!

该项目采用的JSP,Servlet的,jQuery的,Tomcat的6。

字符集在JSP中被设置为UTF-8,所有的Tomcat连接器使用的URIEncoding = UTF-8和我也使用的字符编码过滤器如描述在这里 。 另外,我设置META标记,contentType和我的浏览器中正确检测到它。

在阿贾克斯与jQuery要求我对我想要的URL参数使用,然后序列化()整体参数与$ .PARAM的条款使用encodeURIComponent方法()。 在被调用的servlet这些参数与Java.net.URLDecoder.decode正确解码(术语“UTF-8”)。

在一些地方,我产生了从JSP中参数映射HREF元素的URL。 每个参数值进行编码Java.net.URLEncoder.encode(值,“UTF-8”)上JSP侧但随后的方式在破碎特殊字符结果之前相同对其进行解码。 相反,我必须把它编码为在JSP中,然后正确地解码为在servlet“UTF-8”,“ISO-8859-2”。

用于澄清的示例:术语“ü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”,即百分比符号也百分比编码。 类似地,工作对我来说,如果我从参数映射每个值调用两次编码(名词,“UTF-8”)。

编码一次,而不是在“überfall”字符串结果再次进行解码。

Answer 1:

就是Java内部使用什么编码? 你启动应用程序与

-Dfile.encoding=utf-8

请澄清其中“在JSP页面参数映射”的定义。 它来自一些持久数据存储或者在你的代码作为文字给出的字符串?

在什么一些想法是怎么回事,这可能会有所帮助:

ü是什么出来时, UTF-8编码ü阅读期待ISO-8859-1 ,当每个字节自身解码。 %C3%BC是两者的URI编码representationg UTF-8字节的UTF-8 ü 。 我认为这是发生了什么:

%C3%BC错误解码到→ ü它获取编码到→ %C3%83%C2%BC然后把它再次解码到→ ü所以你最终überfall

所以我想,你使用了错误的编码为URI编码的串进行解码。 这可能是与被Java / JVM所使用的内部编码:

默认情况下,如果认识到主机操作系统只支持欧洲语言的JRE 7安装程序安装一个欧洲语言的版本。



Answer 2:

我想我解决了问题,现在肯定。

继Jontro的评论我编码的所有URL参数值一次,除去人工servlet的侧解码。

发送ü应该像%C3%BC其中给我的Firebug的网络选项卡ü在servlet。 Java是绝对设置为“UTF-8”内部编码与-Dfile.encoding参数。 我追踪的问题像这样的request.getParameter()方法。 request.getQueryString是确定的,但提取的实际参数,当它失败:

request.getCharacterEncoding())=> UTF-8
request.getContentType()=>空
request.getQueryString()=>从= 0&= RESULTCOUNT 10 sortAsc =真检索类别= BC快速和术语=%C3%
用request.getParameter( “术语”)=>那张
Charset.defaultCharset()=> UTF-8
OutputStreamWriter.getEncoding()=> UTF8
新的字符串(用request.getParameter( “术语”)。getBytes()构造,UTF-8)=>那张
System.getProperty( “的file.encoding”)=> UTF-8

通过寻找到Tomcat和狼的它们实现的request.getParameter来源()我发现了问题:从连接器的URIEncoding总是空,在这种情况下默认为org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING这是“ISO- 8859-1" 像沃尔弗拉姆说。

长话短说:我的错,是编辑Tomcat的conf目录在server.xml当在服务器视图中创建一个新的服务器,只装载一次到Eclipse! 在此之后,在服务器项目中一个单独的server.xml中必须进行编辑。 这样做之后,连接设置是否正确装入和一切正常,因为它应该。

感谢您的意见! 希望这可以帮助别人...



文章来源: Broken UTF-8 URI Encoding in JSPs