Servlet中的编码问题

3
我有一个Servlet,从客户端接收一些参数,然后执行一些任务。 而来自客户端的参数是中文,因此我经常在Servlet中得到一些无效字符。 例如: 如果我输入
http://localhost:8080/Servlet?q=中文&type=test

在servlet中,'type'参数是正确的(测试),但是'q'参数没有正确编码,它们变成了无法解析的无效字符。
然而,如果我再次输入地址栏,URL将会改变为:
http://localhost:8080/Servlet?q=%D6%D0%CE%C4&type=test

现在我的servlet将获取'q'的正确参数。
问题是什么?
更新
顺便说一下,当我用post发送表单时,它可以正常工作。但是当我在ajax中发送它们时,例如:
url="http://..q='中文',
xmlhttp.open("POST",url,true); 

然后,服务器端也收到了无效字符。
似乎只有当中文字符被编码为 %xx 时,服务器端才能得到正确的结果。
也就是说,http://.../q=中文 不起作用,http://.../q=%D6%D0%CE%C4 起作用。
但是为什么 "http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&q=%E4%B8%AD%E6%96%87&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=&gs_rfai=" 起作用? alt text
4个回答

10

确保表单页面本身的编码也是UTF-8,并确保浏览器被指示以UTF-8读取页面。假设它是JSP,请将以下内容放在页面的顶部即可实现:

<%@ page pageEncoding="UTF-8" %>

接下来,为了以UTF-8格式处理GET查询字符串,请确保使用的servlet容器已进行了相应配置。由于不清楚您正在使用哪个,因此以下是一个Tomcat示例:将/conf/server.xml<Connector>元素的URIEncoding属性设置为UTF-8

<Connector URIEncoding="UTF-8">

如果您想使用POST方式,那么您需要确保HttpServletRequest被指示使用UTF-8解析POST请求正文。
request.setCharacterEncoding("UTF-8");

在访问第一个参数之前调用此方法。最好将其放置在Filter中。

另请参阅:


当使用ajax发送请求时,您需要对单个请求参数进行encodeURIComponent()编码。或者,使用jQuery,当将参数作为$.ajax()函数的data参数发送时,它会自动处理。 - BalusC

1

在GET参数(即URL中)使用非ASCII字符通常会出现问题。RFC 3986建议使用UTF-8,然后进行百分比编码,但据我所知,这不是官方标准。而且,在它能工作的情况下,你使用的东西并不是UTF-8!

最安全的做法可能是切换到POST请求。


0

我认为问题出在发送端。根据您的描述,如果您在浏览器中编写URL,则会获得“正确”编码的请求。这是由浏览器完成的:它知道如何将Unicode字符转换为类似于%xx的代码序列。

因此,请尝试检查您发送请求的方式。它应该在发送时进行编码。

另一种可能性是使用POST方法而不是GET方法。


现在我使用post方法从表单中发送参数。但是我的servlet将作为服务工作,可以被其他客户端调用。因此,他们可能会调用servlet并构建url字符串,并在javascript中发送它。如果这样,我不能期望浏览器转换url。顺便说一句,我听说有人使用request.setCharacterEncoding('utf-8')和String p=new String(request.getparameter('p').getBytes('ISO-8859-1'),'utf-8')。但它不起作用。 - hguser

0
请阅读有关URL编码格式的文章“www.blooberry.com/indexdot/html/topics/urlencoding.htm”。
如果您愿意,可以将字符转换为十六进制或Base64,并将它们放入URL的参数中。
我认为最好将它们放在正文(Post)中而不是URL(Get)中。

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