我有一个servlet从客户端接收一些参数,然后做一些工作。 来自客户端的参数是中文,所以我经常在服务器中得到一些无效字符。 例如: 如果我输入
http://localhost:8080/Servlet?q=中文&type=test
然后在servlet中,'type'的参数是正确的(test),但是'q'的参数没有正确编码,它们变成无法解析的无效字符。
但是,如果我再次进入加料栏,则网址将更改为:
http://localhost:8080/Servlet?q=%D6%D0%CE%C4&type=test
现在我的servlet将获得'q'的正确参数。
UPDATE
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=
”有效?
答案 0 :(得分:10)
确保具有表单的页面的编码也是UTF-8,并确保指示浏览器将页面读取为UTF-8。假设它是JSP,只需将它放在页面顶部即可实现:
<%@ page pageEncoding="UTF-8" %>
然后,要将GET查询字符串处理为UTF-8,请确保将有问题的servletcontainer配置为执行此操作。目前还不清楚你正在使用哪一个,所以这里有一个Tomcat示例:将URIEncoding
中<Connector>
元素的/conf/server.xml
属性设置为UTF-8
。
<Connector URIEncoding="UTF-8">
对于您要使用POST的情况,您需要确保指示HttpServletRequest
使用UTF-8解析POST请求正文。
request.setCharacterEncoding("UTF-8");
在之前调用此,即可访问第一个参数。 Filter
是最佳选择。
答案 1 :(得分:1)
使用非ASCII字符作为GET参数(即在URL中)通常是有问题的。 RFC 3986建议使用UTF-8然后使用百分比编码,但AFAIK不是官方标准。你正在使用它的工作不是 UTF-8!
切换到POST请求可能是最安全的。
答案 2 :(得分:0)
我认为问题出在发送方面。正如我从您的描述中所理解的,如果您在浏览器中编写URL,则会获得“正确”编码的请求。这项工作由浏览器完成:它知道将unicode字符转换为%xx等代码序列。
因此,请尝试检查您如何发送请求。它应该在发送时进行编码。
其他可能性是使用POST方法而不是GET。
答案 3 :(得分:0)
请阅读有关URL编码格式“www.blooberry.com/indexdot/html/topics/urlencoding.htm”的文章。
如果需要,可以将字符转换为十六进制或Base64,并将它们放在URL的参数中。
我认为最好将它们放入正文(Post),然后放入URL(Get)。