servlet中的编码问题

时间:2010-11-28 12:08:12

标签: java unicode servlets character-encoding

我有一个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

顺便说一下,当我用帖子发送表格时,这句话很好。 我将它们发送到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 个答案:

答案 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)。