从哪里来的 Â (C2)?

11
由于某些原因,一段代码将空格替换为\u00A0——即不间断空格。然后使用此代码对URL进行净化(是的,我知道这很糟糕——在许多方面都是如此)。奇怪的是,在我的测试JSP中显示这些内容时,会出现一个流浪的——为什么呢?
以下是演示此问题的示例JSP。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
    <%
      String[] parameters = request.getParameterValues("p");
      if (parameters == null || parameters.length == 0) {
        parameters = new String[]{""};
      }
    %>
  </head>
  <body>
    <h1>Hello World!</h1>
    <a href='index.jsp?p=<%="Hello\u00A0there"%>'>A Link</a>
    <p><%=parameters[0]%></p>
  </body>
</html>

为什么参数显示为“Hello there”?c2从哪里来的? 附加信息: 顺便说一下:parameter的十六进制是48 65 6c 6c 6f c2 a0 74 68 65 72 65,在原地显示了c2

我在将东西从Gmail复制到纯文本文件时遇到了这些问题。我一次又一次地忘记了,你不能这样做,Gmail会破坏你的纯文本副本。 - Ciro Santilli OurBigBook.com
2个回答

10

Rogue appearing通常是使用UTF-8编码的内容被用"传统"代码页字符集(例如ISO-8859-1、CP850等)解码后出现的指示。


那么在我的情况下,我应该使用什么getParameterValues的替代方法? - OldCurmudgeon
1
@OldCurmudgeon,请告诉您的容器正确地将字节解码为字符。在Tomcat中,使用server.xml中的URIEncoding参数。 - Michael-O
1
就是这样!将 <parameter-encoding default-charset="UTF-8"/> 添加到我的 glassfish-web.xml 文件中解决了问题。 - OldCurmudgeon

5
为了回答实际问题“Â(C2)从哪里来?”,您可能会发现这篇文章很有帮助。
非断空格,在UTF-16中为0x00A0,在UTF-8中编码为0xC2A0

表格也可能有所帮助。

Examples of encoded Unicode characters (in hexadecimal notation)

16-bit Unicode    UTF-8 Sequence
0001              01
007F              7F
0080              C2 80   <-- this was the case of nbsp
07FF              DF BF
0800              E0 A0 80
FFFF              EF BF BF
010000            F0 90 80 80
10FFFF            F4 8F BF BF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接