在我尝试使用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
有人可以帮我理解同一输入的不同输出吗?另外,每次解码相同的字符串时,如何获得标准化输出?
答案 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%A9
(latin small letter e with acute - 两个%
,因为在UTF-8中它需要两个字节。)
同样,这两种表示都没有问题。两者都是Unicode Normalization的形式。众所周知,Mac OS Xs倾向于使用组合的锐音来编码;最后,编码器是一个优先考虑的问题。在您的情况下,必须有不同的JRE,或者如果该文件名是用户生成的,那么用户可能使用了生成该编码的不同操作系统(或工具)。