UTF-8 URL解码/编码

时间:2011-11-16 06:55:28

标签: java jquery spring tomcat utf-8

我指示我的URL发送类似的Ajax请求:

url += '/' + something + '/' + id;
var response;
$.ajax({
    async : false,
    type: 'DELETE',
    url: url,
 ...

我的removeId是一个包含UTF-8字符的变量。我将在Java端处理该变量:

@RequestMapping(value = "/something/{id}", method = RequestMethod.DELETE)
    public void myMethod(HttpServletResponse response, @PathVariable String id) {
    ...

然而,Java端的id变量与原始变量不同,因为UTF-8字符变为奇怪的东西。

如何从JavaScript端发送UTF-8字符并在Java端再次转换(使用REST的Spring 3,我的Web服务器是Tomcat 7)?

PS 1:即使我不使用encodeUriComponent,我的网址似乎也在自行编码?

PS 2:为了更清楚地提出问题:

i.e. my id variable is araç and sent URL is: localhost:8080/sdfasf/ara%C3%A7 

当我看到id变量具有该值时:

araç

而不是:

ara%C3%A7 

Spring(或Tomcat)会自动执行吗?当控制器作为路径变量时,有没有办法自动解码它(我的意思是没有写任何东西:

URLDecoder.decode(id,"UTF-8");

它会自动转换)

6 个答案:

答案 0 :(得分:16)

您看到的id值似乎使用iso-8859-1 charset而不是utf-8进行解码。在java EE中未指定url的路径部分的编码,并且没有标准的api来设置它。对于查询参数,您可以在访问任何参数之前使用request.setCharacterEncoding以正确解码它们。 CharacterEncodingFilter完全相同,但对路径参数没有影响。

要在Tomcat中使用此功能,您必须将URIEncoding元素的Connector属性设置为" utf-8"。

您可以在this excellent answer中找到有关java webapp中字符编码的所有想法。

答案 1 :(得分:3)

我在这里找到答案:http://forum.springsource.org/showthread.php?14063-How-to-set-setCharacterEncoding-on-Request

我在Spring方面做了那个配置:

<filter>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

它适用于UTF-8。

答案 2 :(得分:1)

您是否尝试在嵌入javascript的页面上设置页面编码?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 

答案 3 :(得分:1)

通过在起始<head>标记下方添加此页面,确保页面编码设置为UTF-8:

<meta charset="utf-8">

还要确保使用UTF-8编码保存JavaScript文件。检查文本编辑器设置。

答案 4 :(得分:0)

在JavaScript中使用:

data=encodeURIComponent(data);

用于编码数据,在Java中,您可以这样做:

data=java.net.URLDecoder.decode(data);

答案 5 :(得分:-1)

无需在javascript端对字符串进行编码。 Java不支持unicode,因此解码需要在那里完成:

output = new String(input.getBytes("ISO-8859-1"), "UTF-8");