2010-09-17 88 views
12

我的Servlet不會使用UTF-8作爲JSON響應。爲什麼我的Servlet不會以UTF-8響應JSON請求?

MyServlet.java

public class MyServlet extends HttpServlet { 

    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception { 

    PrintWriter writer = res.getWriter(); 

    res.setCharacterEncoding("UTF-8"); 
    res.setContentType("application/json; charset=UTF-8"); 

    writer.print(getSomeJson()); 
    } 
} 

但特殊字符顯示不出來,當我檢查,我在Firebug找回的頭,我看到Content-Type: application/json;charset=ISO-8859-1

我在我的Servlet目錄中做了一個grep -ri iso .,結果什麼都沒有,所以我沒有明確地將類型設置爲ISO-8859-1。

我還應該指出,我在Eclipse中將Tomcat 7作爲開發環境,使用Solaris 10以及任何他們稱之爲Web服務器環境(其他人管理此)作爲生產環境運行此操作,和行爲是一樣的。

我也確認了提交的請求是UTF-8,只有響應是ISO-8859-1。

更新

我修改了代碼,以反映我打電話的PrintWriter之前,我設置的字符編碼。我從原來的例子中忽略了這一點,現在我意識到這是我的問題的根源。我讀here,您必須先設置字符編碼,然後再撥打HttpServletResponse.getWriter(),否則getWriter會將它設置爲ISO-8859-1。

這是我的問題。所以上面的例子應該調整到

public class MyServlet extends HttpServlet { 

    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception { 

    res.setCharacterEncoding("UTF-8"); 
    res.setContentType("application/json"); 

    PrintWriter writer = res.getWriter(); 
    writer.print(getSomeJson()); 
    } 
} 
+1

感謝您的「更新」,這正是我正在尋找的:首先設置字符編碼,其次獲取作家。 – 2014-06-16 17:16:10

回答

4

爲響應設置編碼後,無法更改。

強制UTF-8的最簡單方法是創建您自己的過濾器,它是第一個查看響應並設置編碼的過濾器。

看看how Spring 3.0 does this。即使你不能在你的項目中使用Spring,也許你可以得到一些啓發(確保你的公司政策允許你從開源許可證獲得靈感)。

+0

你是對的,無法改變編碼。我設置了兩次,但沒有明確。我是用getWriter隱式地做的。看到我更新的問題。感謝您的幫助和+1。 – 2010-09-17 19:19:53

1

代碼看起來不錯。要麼你沒有運行你認爲正在運行的代碼,要麼有一些Filter或代理在請求 - 響應鏈中的某處修改內容類型。

+0

我不知道這會發生在哪裏,除非它是我的環境的默認行爲。有一個源文件,我從頭開始編寫它。但這也是我的第一個Servlet,所以我不知道'Filter'是什麼。 – 2010-09-17 17:35:43

+0

webapp的'/ WEB-INF/web.xml'中沒有其他的東西? Tomcat的版本究竟是什麼?下載/安裝後,你在'/ conf/web.xml'文件中修改了什麼? – BalusC 2010-09-17 17:52:57

+0

沒有別的。看到我更新的問題。 – 2010-09-17 18:01:57

0

除了具體問題,你真的應該考慮獲取輸出流,使用JSON庫直接編寫內容爲UTF-8編碼的JSON;使用作家沒有任何好處。 一些JSON包只能用於字符串,這是不幸的,但大多數允許使用更高效的流(解析器/生成器可以處理轉義和編碼方面更安全和更高效)。

+0

謝謝你的建議。我會研究這個。這是我的第一個servlet,所以我對可用的庫不太熟悉。我必須使用我們的默認Solaris 10環境中提供的任何東西。 – 2010-09-19 18:13:07

相關問題