在读取HTTP请求参数时将垃圾字符添加到字符串

时间:2014-08-28 17:11:29

标签: java servlets httprequest html-form

我有一个HTML格式:

<p> Select beer characteristics </p>
<p> 
  Color: 
  <select name="color" size="1">
    <option value="light"> light </option>
    <option value="amber"> amber </option>
    <option value="brown"> brown </option>
    <option value="dark"> dark </option>
  </select>
  <br><br> 
</p>
<input type = "submit" value="submit">
  • 对于输入参数name =“color”,有四个选项:浅色,琥珀色,棕色,深色
  • 根据选择的值,显示结果页面
  • 但是,当我选择一个选项时,会在字符串的前面和末尾添加一些垃圾字符作为选项值
  • 关于调试,当我使用request.getParameter(“color”)读取时,这是读取的值(在选择“琥珀色”时): â€amberâ€
  • 这导致后端出现问题,我想与输入参数
  • 进行字符串匹配

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

您在HTML代码中使用了错误的引号字符。

你可能拥有的是这样的东西:

<option value=“light“>

除非您使用正确的双引号(“)或单引号(')来包含属性,否则浏览器会将值解释为“light“而不是light,这就是它发送到的内容服务器。

(请注意,这在XHTML中无效,其中只允许使用引用属性,但在纯HTML中指定<foo bar=value>格式的属性有效。)

奇怪的输出可以解释为您的浏览器和服务器使用不同的编码:一个使用ISO-8859-1,另一个使用UTF-8。左双引号字符的UTF-8序列为0xe2 0x80 0x9c,当使用ISO-8859-1读取时,恰好提供您提到的两个字符。 (第三个落在一个未使用的块中,然后静默地丢弃。)

这是一个需要补救的单独问题,请参阅其他答案以获取处理它的提示。

答案 1 :(得分:2)

这是浏览器中错误编码的结果,很可能没有在响应中设置。您可以尝试使用:

response.setContentType("text/html; charset=UTF-8");

答案 2 :(得分:2)

我确信这与字符编码或URL编码不匹配有关。

首先,确保指定字符集

<form action="..." method="..." accept-charset="UTF-8">
    <select ...> ... </select>
</form>

如果客户端使用良好的编码(UTF-8)正确发送所有内容,则必须配置服务器端以读取数据。

我不知道你正在使用什么,但有一种方法是:

URLDecoder.decode(formParams, "UTF-8");

可以肯定的是,您也可以在HTML文件中添加编码:

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    ...
</head>

编辑:确保正确发送和接收所有内容。

从服务器发送HTML文件:

1)确保设置:
内容类型:text / html;字符集= UTF-8

如果您要发送文件,请务必使用UTF-8编码保存文件。 如果您的HTML是生成的String,请使用:

PrintWriter writer = new PrintWriter(new OutputStreamWriter(httpOutputStream, "UTF-8"));
writer.print(string);
...

来自请求的URL以US-ASCII编码接收:

String urlEncodedString = new String(receivedBytes, "UTF-8");
String decoded = URLDecoder.decode(urlEncodedString, "UTF-8");

答案 3 :(得分:0)

使用wkhtmltopdf将xhtml转换为PDF时遇到了同样的问题 工具。

在我的HTML模板中添加<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">解决了这个问题。