2010-10-22 153 views
50

我的Java Web應用程序提交返回JSON這樣的AJAX請求:JSON字符編碼

{'value': 'aériennes'} 

當「aériennes」被顯示在網頁時,顯示爲「ariennes」,所以我想有一些種字符編碼問題。 AJAX響應標頭包括

Content-Type application/json 

它似乎沒有包含任何字符集信息。我想這需要改變的東西像

Content-Type text/html; charset=iso-8859-1  (or charset=utf8) 

應用程序是Spring MVC中的服務器端,我想必須有設置每個響應的默認字符集的方法嗎?

回答

14

首先,您發佈的數據不是有效的JSON。這將是:

{"value": "aériennes"} 

請注意雙引號:它們是必需的。

JSON數據的內容類型should beapplication/json。實際的JSON數據(我們上面的)應該使用UTF-8,UTF-16或UTF-32編碼 - 我推薦使用UTF-8。

您可以使用像Wireshark這樣的工具來監視網絡流量並查看數據的外觀,您應該看到é字節爲c3 89。我從來沒有與Spring合作過,但是如果它正在執行JSON編碼,那麼這對您來說可能是正確的。

一旦JSON到達瀏覽器,它應該是好的,如果它是有效的。但是,您如何將JSON響應中的數據插入到網頁中?

52

症狀表明最初使用UTF-8編碼的JSON字符串使用ISO-8859-1編碼寫入HTTP響應,並指示webbrowser將其顯示爲UTF-8。如果它是使用UTF-8編寫的並顯示爲ISO-8859-1,那麼您將會看到aériennes。如果使用ISO-8859-1顯示,那麼您將會看到a�riennes

要解決JSON字符串被錯誤地寫爲ISO-8859-1的問題,您需要配置您的webapp/Spring使用UTF-8作爲HTTP響應編碼。 基本上,它應該做的事情在幕後執行以下操作:

response.setCharacterEncoding("UTF-8"); 

不要改變你的內容類型頭。這對JSON來說非常好,它已經被顯示爲UTF-8。

4

這發生在我身上正好與此相同:

<%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%> 

但是,這對我的作品:

<%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%> 

嘗試增加

;charset=UTF-8 

您的contentType。

3
response.setContentType("application/json;charset=utf-8"); 
30

我不知道這是否相關,但我使用@RequestMapping註解對其進行了修復。

@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"}) 
+0

謝謝Lars Juel Jensen!你的答案解決了我的這篇文章的問題http://stackoverflow.com/questions/29865056/jquery-datatables-does-not-show-unicode-characters – 2015-04-25 12:57:02

0

如果您使用StringEntity嘗試this,使用的字符編碼的選擇。它也處理外來字符。

6

我終於得到了解決:

只有把這個線

@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8") 

這有一定幫助。

0

此外,您還可以使用Spring註解RequestMapping上述控制器類receveing 應用/ JSON; UTF-8在所有響應

@Controller 
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"}) 
public class MyController{ 
... 
} 
0

如果上述建議的解決方案並沒有解決您的問題(對我來說),這可能也有幫助:

我的問題是我在使用Springs @ResponseBody在我的響應中返回一個json字符串。如果你也這樣做,這可能會有所幫助。

將以下bean添加到您的調度程序servlet。

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean 
       class="org.springframework.http.converter.StringHttpMessageConverter"> 
       <property name="supportedMediaTypes"> 
        <list> 
         <value>text/plain;charset=UTF-8</value> 
        </list> 
       </property> 
      </bean> 
     </list> 
    </property> 
</bean> 

(這裏找到:http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8

1

這些問題的答案在這裏幫我解決我的問題,雖然它不是完全相關。 我使用javax.ws.rs API和@Produces和@Consumes註釋,並有這個相同的問題 - 我在web服務中返回的JSON不是UTF-8。我用下面的註解解決它在我的控制器功能頂:

@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8") 

@Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8") 

在每個端點的GET和POST功能。我沒有設置字符集,這解決了它。這是球衣的一部分,所以也許你必須添加一個Maven依賴。