UTF-8 URL解码/编码

14

我指示我的 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端(使用Spring 3和REST,我的Web服务器是Tomcat 7)再次进行转换?

PS 1:即使我不使用encodeUriComponent函数,似乎我的URL也会自动进行编码?

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个回答

16
你所看到的id值似乎是使用iso-8859-1字符集而不是utf-8进行解码的。Java EE中未指定url路径部分的编码方式,并且没有标准API可用于设置它。对于查询参数,您可以在访问任何参数之前使用request.setCharacterEncoding使它们正确解码。 CharacterEncodingFilter 正是这样做的,但对路径参数没有影响。
要使其在Tomcat中工作,您需要将其 server.xml 中的 Connector 元素的 URIEncoding 属性设置为 "utf-8"。
关于Java Web应用程序中字符编码的所有信息都可以在这个出色的答案中找到,该答案回答了类似的问题。

1
感谢您的回答和点赞。我只是想确认一下。我使用Spring并进行了配置(没有对Tomcat做任何操作),我认为我解决了我的问题。我有什么遗漏吗(我的意思是,也许我没有完全解决问题,某些字符也会出错?)是否有任何关于如何使用request.setCharacterEncoding的示例? - kamaci
@kamaci:当我发布我的答案时,我没有意识到那是你的答案,并且它已经解决了你的问题。在Oracle的OC4j容器中,使用setCharacterEncoding无法处理路径参数,也许在Tomcat中可以。尽管这与类似问题的某些答案相矛盾,例如https://dev59.com/G13Ua4cB1Zd3GeqP9Rgv#8079547或https://dev59.com/Nk3Sa4cB1Zd3GeqPsyck#2630977。 - Jörn Horstmann

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方面的表现也很好。


1

请确保将页面编码设置为UTF-8,方法是在起始的<head>标签下方添加以下内容:

<meta charset="utf-8">

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

@kamaci console.log(url); 会输出什么? - Mathias Bynens
@nathias Bynens 当我执行 console.log(url); 时,它也是 ara%C3%A7。 - kamaci
@kamaci 但是当你 console.log(id) 时,你会得到 "araç" 吗?不可能。 - Mathias Bynens
@kamaci,你为什么要在JavaScript中进行编码?你的代码示例中并没有显示出来。 - Mathias Bynens
我现在没有对它进行编码。只是我尝试对其进行编码并发送到服务器(如PS 1所示),但结果仍然相同。我现在没有对其进行编码。感谢您的帮助。 - kamaci
显示剩余2条评论

1
你尝试在嵌入JavaScript的页面上设置页面编码了吗?
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 

0

在 JavaScript 中使用:

data=encodeURIComponent(data);

对于数据编码,在Java中您可以使用以下代码:

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

在这个问题中,id是请求路径的一部分,因此它已经被servlet容器解码。另外,应该调用decode方法并指定第二个参数来指定要使用的字符集。 - Jörn Horstmann

-1

JavaScript端不需要对字符串进行编码。 Java不支持Unicode,因此需要在那里进行解码,如下所示:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接