为什么java.net.URLEncoder为相同的字符串提供不同的结果?

时间:2015-04-09 22:26:51

标签: java url encode

在我尝试使用médicaux_Jérôme.txt编码“java.net.URLEncoder”时在webapp服务器上,它提供以下字符串:

me%CC%81dicaux_Je%CC%81ro%CC%82me.txt

当我尝试编码相同的字符串时,在我的后端服务器上,它提供以下内容:

m%C3%A9dicaux_J%C3%A9r%C3%B4me.txt

有人可以帮我理解同一输入的不同输出吗?另外,每次解码相同的字符串时,如何获得标准化输出?

1 个答案:

答案 0 :(得分:4)

如果您没有指定平台,结果取决于平台。

请参阅java.net.URLEncoder javadocs

  

encode(String s)

     

<强>已过时即可。

     

结果字符串可能因平台的默认编码而异。而是使用encode(String,String)方法指定编码。

因此,请使用suggested method并指定编码:

String urlEncodedString = URLEncoder.encode(stringToBeUrlEncoded, "UTF-8")

关于同一字符串的不同表示,如果您指定了"UTF-8"

您在问题中提供的两个URL编码字符串虽然编码不同,但代表相同的未编码值,因此没有任何内在错误。通过编写in a decode tool,我们可以验证它们是否相同。

正如我们在这种情况下所看到的那样,这是因为有多种方法对同一个字符串进行URL编码,特别是如果它们具有急性重音(由于combining acute accent,正是在你的情况)。

对于您的情况,具体而言,第一个字符串编码为é e + ´latin small letter e +组合急性重音),结果为e%CC%81。第二个将é直接编码为%C3%A9latin small letter e with acute - 两个%,因为在UTF-8中它需要两个字节。)

同样,这两种表示都没有问题。两者都是Unicode Normalization的形式。众所周知,Mac OS Xs倾向于使用组合的锐音来编码;最后,编码器是一个优先考虑的问题。在您的情况下,必须有不同的JRE,或者如果该文件名是用户生成的,那么用户可能使用了生成该编码的不同操作系统(或工具)。