网址编码问题< - > utf8< - >异

时间:2014-01-29 19:39:08

标签: java encoding utf-8 character-encoding iso-8859-1

我有一个涉及网络电话的奇怪问题,我无法在本地复制。

我正在测试必须设置为接收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,POST的主体编码是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行是我使用不同编码制作新字符串的一些测试(字面意思是new String(byteArr, charset)

所以这一切都很好,并且预期的行为,尽管在当地。另外,我注意到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根据那些byte->字符串方法为我提供�?

UTF中的

C3 A9é

任何帮助或见解都会很棒。

0 个答案:

没有答案