2011-11-16 170 views
14

我教我的URL發送一個Ajax請求這樣的:UTF-8 URL解碼/編碼

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

removeId是包括UTF-8字符的變量。我會處理該變量在Java方面那樣:在Java方面

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

然而id變量是從原來的不同,因爲UTF-8字符更改奇怪的事情。

如何從JavaScript端發送UTF-8字符並在Java端再次轉換它(Spring 3 with 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"); 

它會自動轉換)

回答

16

您看到的id值似乎是使用iso-8859-1字符集而不是utf-8解碼的。 url的路徑部分的編碼沒有在java EE中指定,並且沒有標準api來設置它。對於查詢參數,您可以在訪問任何參數之前使用request.setCharacterEncoding以使其正確解碼。 CharacterEncodingFilter確實如此,但對路徑參數沒有影響。

要在Tomcat中完成這項工作,您必須將中的Connector元素的URIEncoding屬性設置爲「utf-8」。

所有你想知道關於在java webapp中的字符編碼可以在this excellent answer找到類似的問題。

+1

感謝您的回答並投票。我只是想確定。我使用Spring並做了配置(對Tomcat沒有做任何事情),我認爲我解決了我的問題。我錯過了什麼(我的意思是也許我沒有完全解決問題,有些角色也會出錯?)並且有沒有關於如何使用request.setCharacterEncoding的示例? – kamaci

+0

@kamaci:我沒有意識到這是你的答案,當我發佈我的答案時,它已經解決了你的問題。調用'setCharacterEncoding'不能用於oracle的OC4j容器的路徑參數,也許它使用tomcat。雖然這與一些類似的問題的答案相矛盾,如http://stackoverflow.com/questions/8079152/charset-filter-causing-issue-in-parsing-utf-8-characters/8079547#8079547或http://stackoverflow.com/questions/2630748/how-to-enable-reading-non-ascii-characters-in-servlets/2630977#2630977 –

+0

感謝您的詳細解答。 – kamaci

1

您是否嘗試過在設置頁面編碼你正在嵌入JavaScript的頁面?

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

確保頁面編碼是通過將起始<head>標籤下面這種權利設置爲UTF-8:

<meta charset="utf-8"> 

還要確保JavaScript文件保存使用UTF-8編碼。檢查你的文本編輯器設置。

+0

我有一個線在我的HTML和我的編輯器保存我的網頁爲UTF-8:所以解碼需要在那裏進行的 Java不支持Unicode。我認爲這是通過URL發送UTF-8變量的問題? – kamaci

+0

@kamaci'console.log(url);'說什麼? –

+0

我的id變量是'araç',URL是:http:// localhost:8080/sdfasf/ara%C3%A7 – kamaci

0

在JavaScript中使用:

data=encodeURIComponent(data); 

對數據進行編碼,並在Java中,你可以這樣做:

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

在問題中,id是請求路徑的一部分,因此它已被servlet容器解碼。此外,應使用指定要使用的字符集的第二個參數來調用「decode」方法。 –

3

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

我這樣做,配置在我彈簧邊:

<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

沒有必要在javascript端編碼字符串。

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