2012-05-23 46 views
10

在其中一個項目中,我在表單數據中提供了非英文內容(芬蘭語)。我們在PrimeFaces中使用JSF 2.0。將數據提交給服務器時遇到問題。我提交表單時數據被破壞。只有芬蘭人在這方面變得腐敗。JSF中提交的UTF-8格式正在破壞數據

有沒有人遇到過這個問題,並找到了解決方案?

+0

你在提交上傳文件?我開發捷克語的應用程序,這發生在我身上用ICEfaces的文件上傳組件。但在正常情況下,一切都很好。你可以使用Filter設置芬蘭字符集,但它仍然是奇怪的錯誤 –

回答

20

這是PrimeFaces 3.0以來的已知問題。這是由它檢查當前HTTP請求是否是ajax請求的方式發生變化引起的。它通過請求參數而不是請求頭標識。在恢復JSF視圖之前首次檢索請求參數時,將使用服務器的默認字符編碼(通常爲ISO-8859-1而非JSF自己的默認字符編碼UTF-8)來解析所有請求參數。有關深入的解釋,請參閱Unicode input retrieved via PrimeFaces input components become corrupted

其中一個解決方案是創建一個過濾器,它不會request.setCharacterEncoding("UTF-8")

@WebFilter("*.xhtml") 
public class CharacterEncodingFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 
     request.setCharacterEncoding("UTF-8"); 
     chain.doFilter(request, response); 
    } 

    // ... 
} 
+0

它爲我工作與以下注釋: @WebFilter(filterName =「CharacterEncodingFilter」,urlPatterns = {「/ *」}) 謝謝 – Kiavash

+2

@Kia:顯然你的'FacesServlet'沒有被映射到'* .xhtml',而是映射到'/ faces/*'或'* .jsf'等其他東西。然後您應該將過濾器的URL模式更改爲相同。 '/ *'確實會匹配**每個** HTTP請求。順便說一句,只是'@WebFilter(「/ *」)'也是足夠的。 – BalusC