servlet中的编码问题

hgu*_*ser 3 java unicode servlets character-encoding

我有一个servlet从客户端接收一些参数,然后做一些工作.来自客户端的参数是中文,所以我经常在服务器中得到一些无效字符.例如:如果我进入

http://localhost:8080/Servlet?q=??&type=test
Run Code Online (Sandbox Code Playgroud)

然后在servlet中,'type'的参数是正确的(test),但是'q'的参数没有正确编码,它们变成无法解析的无效字符.

但是,如果我再次进入加法器栏,则网址将更改为:

http://localhost:8080/Servlet?q=%D6%D0%CE%C4&type=test
Run Code Online (Sandbox Code Playgroud)

现在我的servlet将获得'q'的正确参数.

问题是什么?

UPDATE

顺便说一下,当我用帖子发送表格时,它很好.我将它们发送到ajax中,例如:

url="http://..q='??',
xmlhttp.open("POST",url,true); 
Run Code Online (Sandbox Code Playgroud)

然后服务器端也获得无效字符.

似乎只有当中文字符编码为%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="工作? 替代文字

Bal*_*usC 10

确保具有表单本身的页面的编码也是UTF-8,并确保指示浏览器将页面读取为UTF-8.假设它是JSP,只需将它放在页面顶部即可实现:

<%@ page pageEncoding="UTF-8" %>
Run Code Online (Sandbox Code Playgroud)

然后,要将GET查询字符串处理为UTF-8,请确保将有问题的servletcontainer配置为执行此操作.目前还不清楚你正在使用哪一个,所以这里有一个Tomcat示例:将元素的URIEncoding属性设置为.<Connector>/conf/server.xmlUTF-8

<Connector URIEncoding="UTF-8">
Run Code Online (Sandbox Code Playgroud)

对于您想要使用POST的情况,您需要确保HttpServletRequest指示使用UTF-8解析POST请求正文.

request.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

访问第一个参数之前调用它.A Filter是最好的地方.

也可以看看: