为什么java.net.URLEncoder对相同的字符串给出不同的结果?

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

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

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

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

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

解决方法:

如果不指定结果,则取决于平台.

参见java.net.URLEncoder javadocs

encode(String s)

Deprecated

The resulting string may vary depending on the platform’s default encoding. Instead, use the encode(String,String) method to specify the encoding.

因此,使用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结合了重音符),结果为é.第二个将é直接编码为é(latin small letter e with acute-2%,因为在UTF-8中需要两个字节).

同样,两种表示形式都没有问题.两者都是Unicode Normalization的形式.众所周知,Mac OS X倾向于使用组合的重音符号进行编码.最后,这是编码器的偏好问题.在您的情况下,必须有不同的JRE,或者,如果该文件名是用户生成的,则用户可能使用了生成该编码的其他OS(或工具).

上一篇:PHP,SMTP-电子邮件中的主题将国际字符显示为HTML_Entities


下一篇:mysql 合并left join 数据条目