我遇到的问题是从URL解码会导致一些重大问题。请求URL包含%C3%BC作为字母'ü'。解码服务器端现在应该将其解码为ü,但它执行此操作:ü
解码是这样完成的:
decoded = URLDecoder.decode(value, "UTF-8");
虽然值包含'%C3%BC'并且解码现在应该包含'ü',但这就是问题所在。这里出了什么问题?我在多个应用程序中使用此方法,并且在所有其他情况下都可以正常运行...
答案 0 :(得分:1)
我还没有足够的声誉发表评论,所以我必须尽可能接近答案。
如果你正在使用servlet,并且“value”是你在servlet上调用getParameter()得到的东西,那么它已经被servlet容器解码(正确或错误)。 (Tomcat的?)
同样,如果它是路径的一部分。您的servlet容器可能会解码它,假设百分比编码的字节是ISO-8859-1,这是Tomcat的默认设置。请参阅文档,了解Tomcat的server.xml文件中Connector元素的URIEncoding属性,如果这是您正在使用的appserver。如果将其设置为UTF-8,Tomcat将假定百分比编码的字节代表UTF-8文本。
答案 1 :(得分:0)
您可能输出错误的值。首先decoded.length()
(假设为1)给出了公平的指示;你也可以转储它,Arrays.toString(decoded.toCharArray())
。
在Windows下的IDE控制台中,您可以看到类似于Windows单字节ANSI编码的混乱。
其余的照顾:
String s;
byte[] b;
s.getBytes() -> s.getBytes(StandardCharsets.UTF_8)
s.getBytes("Cp1252") // Windows Latin-1
new String(b) -> new String(b, StandardCharsets.UTF_8)