Mem*_*eak 8 java request character-encoding
我在JSP页面中有这样一个链接,编码为big5 http:// hello/world?name =婀ㄉ 当我在浏览器的URL栏中输入它时,它将被改为 http:// hello/world?name = %23%24%23 当我们想在jsp页面中获取此参数时,所有字符都已损坏.
我们设置了这个:request.setCharacterEncoding("UTF-8"),因此所有请求都将转换为UTF8.
但为什么在这种情况下,它不起作用?提前致谢!.
ZZ *_*der 14
当您在浏览器的地址栏中输入URL时,浏览器可能会在URL编码之前转换字符编码.但是,这种行为定义不明确,请参阅我的问题,
我们主要在较新的浏览器上获得UTF-8和Latin-1,但我们在旧版本中获得各种编码(包括Big5).因此,最好避免用户直接输入的URL中的非ASCII字符.
如果URL嵌入在JSP中,您可以通过生成它来强制它为UTF-8,
String link = "http://hello/world?name=" + URLEncoder.encode(name, "UTF-8");
Run Code Online (Sandbox Code Playgroud)
在Tomcat上,需要像这样在Connector上指定编码,
<Connector port="8080" URIEncoding="UTF-8"/>
Run Code Online (Sandbox Code Playgroud)
您还需要使用request.setCharacterEncoding("UTF-8")身体编码,但在servlet中设置它是不安全的,因为这仅在未处理参数但其他过滤器或阀门可能触发处理时才有效.所以你应该在过滤器中做到这一点.Tomcat在源代码发行版中附带了这样的过滤器.
为避免摆弄server.xml使用:
protected static final String CHARSET_FOR_URL_ENCODING = "UTF-8";
protected String encodeString(String baseLink, String parameter)
throws UnsupportedEncodingException {
return String.format(baseLink + "%s",
URLEncoder.encode(parameter, CHARSET_FOR_URL_ENCODING));
}
// Used in the servlet code to generate GET requests
response.sendRedirect(encodeString("userlist?name=", name));
Run Code Online (Sandbox Code Playgroud)
要在Tomcat上实际获取这些参数,您需要执行以下操作:
final String name =
new String(request.getParameter("name").getBytes("iso-8859-1"), "UTF-8");
Run Code Online (Sandbox Code Playgroud)
显然(?)request.getParameterURLDecodes()字符串并将其解释为iso-8859-1- 或者在其中URIEncoding设置的任何内容server.xml.有关如何URIEncoding从server.xmlTomcat 7 获取charset 的示例,请参见此处
您不能在URL中包含非ASCII字符 - 您始终需要对它们进行百分比编码.这样做时,浏览器难以渲染它们.如果您以UTF-8编码URL,然后对其进行百分比编码,则渲染效果最佳.对于您的特定URL,这将给出http://hello/world?name=%E5%A9%80%E3%84%89(检查您的浏览器为此特定链接提供的内容).当您在JSP中获取参数时,您需要显式取消引用它,然后从UTF-8解码它,因为浏览器将按原样发送它.
| 归档时间: |
|
| 查看次数: |
24068 次 |
| 最近记录: |