Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java URL编码有问题<-&燃气轮机;utf8<-&燃气轮机;iso_Java_Encoding_Utf 8_Character Encoding_Iso 8859 1 - Fatal编程技术网

Java URL编码有问题<-&燃气轮机;utf8<-&燃气轮机;iso

Java URL编码有问题<-&燃气轮机;utf8<-&燃气轮机;iso,java,encoding,utf-8,character-encoding,iso-8859-1,Java,Encoding,Utf 8,Character Encoding,Iso 8859 1,我有一个奇怪的问题,涉及到一个无法在本地复制的web调用 我正在测试一个必须设置为接收UTF-8字符的web服务。到目前为止,我所做的测试并没有取得成效。以下是我作为参数发送的示例: 雀巢和Mötley Crüe 但以下是我收到的参数: Nestlé和MÃtley Crüe 请注意,这正是我调用request.getParameter()时得到的结果。我已经完成了必要的步骤,以确保在它到达我的servlet(通过Tomcat7)之前,所有内容都被编码为UTF-8。我所有的研究都告诉我,从UT

我有一个奇怪的问题,涉及到一个无法在本地复制的web调用

我正在测试一个必须设置为接收UTF-8字符的web服务。到目前为止,我所做的测试并没有取得成效。以下是我作为参数发送的示例:

雀巢和Mötley Crüe

但以下是我收到的参数:

Nestlé和MÃtley Crüe

请注意,这正是我调用
request.getParameter()
时得到的结果。我已经完成了必要的步骤,以确保在它到达我的servlet(通过Tomcat7)之前,所有内容都被编码为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
第一行是我发送的内容,以及我希望收到的内容

接下来的两个是分别使用UTF-8和ISO-8859-1进行
URLCoder.encode
的结果

之后的两个是第一行中字符串的每个字节的十六进制代码。显然,UTF-8中的é用两个字节(C3,A9)表示,而ISO中用一个字节(E9)表示

接下来的4行是我用不同的编码制作新字符串的一些测试(字面意思是,
newstring(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
e

ISO中的
C3

ISO中的A9

UTF中的
E9
根据那些字节->字符串方法给出了

UTF中的C3 A9
é

任何帮助或洞察都会很好