URL编码的java问题<>utf8<>iso
我遇到了一个奇怪的问题,涉及一个无法在本地复制的web调用
我正在测试一个必须设置为接收UTF-8字符的web服务。到目前为止,我所做的测试并没有取得成效。以下是我作为参数发送的示例:
Nestlé and Mötley Crüe
但我得到的参数如下:
Nestlé and Mötley Crüe
请注意,这正是我调用request.getParameter()
时得到的结果。我已经完成了必要的步骤,以确保在它进入我的servlet(通过Tomcat 7)之前,所有内容都被编码为UTF-8。我所有的研究都告诉我,从UTF-8到ISO-8859-1,这是一个常规编码问题。问题是,ISO-8859-1在这个系统的任何方面都不存在(系统的默认文件编码是UTF-8,帖子的正文编码是UTF-8)
所以我想我应该在当地的环境中稍微摆弄一下,试着想出一个解决方案。下面是输出的转储,并对正在发生的事情进行了一些描述
normal: Nestlé and Mötley Crüe
encoded (utf): Nestl%C3%A9+and+M%C3%B6tley+Cr%C3%BCe
encoded (iso): Nestl%E9+and+M%F6tley+Cr%FCe
normal utf bytes: [4E, 65, 73, 74, 6C, C3, A9, 20, 61, 6E, 64, 20, 4D, C3, B6, 74, 6C, 65, 79, 20, 43, 72, C3, BC, 65]
normal iso bytes: [4E, 65, 73, 74, 6C, E9, 20, 61, 6E, 64, 20, 4D, F6, 74, 6C, 65, 79, 20, 43, 72, FC, 65]
utf bytes to utf string: Nestlé and Mötley Crüe
utf bytes to iso string: Nestlé and Mötley Crüe
iso bytes to utf string: Nestl? and M?tley Cr?
iso bytes to iso string: Nestlé and Mötley Crüe
第一行是我发送的内容,以及我希望收到的内容
接下来两个是分别将URLEncoder.encode
与UTF-8和ISO-8859-1结合使用的结果
之后的两个是第一行中字符串的每个字节的十六进制代码。显然,UTF-8中的é用两个字节(C3,A9)表示,而ISO中用一个字节(E9)表示
接下来的4行是我用不同的编码制作新字符串的一些测试(字面意思是^{
所以这一切都很好,而且是预期的行为,尽管是局部的。另外,我注意到UTF->;ISO行正是我看到的,所以我摆弄servlet代码将其视为ISO,因为UTF一直不起作用。当我设置servlet代码来实现这一点时,我的结果如下:
description: Nestlé and Mötley Crüe
url iso enc: Nestl%E9+and+M%F6tley+Cr%FCe
url iso dec: Nestlé and Mötley Crüe
bytes (UTF): [4E, 65, 73, 74, 6C, C3, A9, 20, 61, 6E, 64, 20, 4D, C3, B6, 74, 6C, 65, 79, 20, 43, 72, C3, BC, 65]
bytes (ISO): [4E, 65, 73, 74, 6C, E9, 20, 61, 6E, 64, 20, 4D, F6, 74, 6C, 65, 79, 20, 43, 72, FC, 65]
utf bytes to utf string: Nestlé and Mötley Crüe
utf bytes to iso string: Nestlé and Mötley Crüe
iso bytes to utf string: Nestl� and M�tley Cr�
iso bytes to iso string: Nestlé and Mötley Crüe
这么多的差异!在这个输出中,第二行和第三行是我尝试在ISO中对值进行URL编码,然后在ISO中对其进行解码的地方
现在让我困惑的是,这个系统是如何计算ISO-8859-1中的字节E9
以某种方式导致é
的。还有servlet代码的转换方法到底是怎么回事,为什么它们与本地示例有根本性的不同
ISO中的E9
是é
ISO中的C3
是Ã
ISO中的A9
是©
UTF中的E9
根据这些字节->;字符串方法
UTF中的C3 A9
是é
任何帮助或见解都会很好
共 (0) 个答案