2010-01-05 66 views
4

我在我的一個JSF(這是一個facelet)中遇到了一個奇怪的問題。我使用RichFaces和一個頁面上我有一個正常的形式JSF表單和德語變音模塊

<h:form></h:form> 

我的問題是,當我提交表單的所有UTF-8字符 - 如德國變音(AOU) - 正在收到加密。如果我在瀏覽器上將頁面更改爲ISO-8859-1,它就可以工作。

如果我擴大與屬性

<h:form id="register-form" acceptcharset="ISO-8859-1"> 

形式它也能工作。 (僅適用於德語元音變音) - 其他UTF-8字符將被加密成不可讀的內容。

有沒有人可以給我這個手?

+0

順便說一句,這件事_might_一個問題(儘管它不應該) - MyFaces的或鑽嘴魚科? – Bozho 2010-01-05 15:36:25

+0

使用Mojarra。 – onigunn 2010-01-05 15:52:35

+0

等等,做了什麼工作?這已經2周了.. – Bozho 2010-01-14 07:36:33

回答

1

您需要設置POST請求編碼HttpServletRequest#setCharacterEncoding()。最好的地方是Filter,它被映射到所需的url-pattern。要獲得統治世界,你當然想要始終使用UTF-8。該doFilter()方法基本上會是這樣的:

if (request.getCharacterEncoding() == null) { 
    request.setCharacterEncoding("UTF-8"); 
} 
chain.doFilter(request, response); 

然而,這不是唯一的,你需要考慮到關於字符編碼。欲瞭解更多的背景信息,併爲Java EE web應用的另一個(詳細)解決方案,您可能會發現這篇文章有用,以及:Unicode - How to get the characters right?

更新:按評論:

我已經實施了一個過濾器 - 一點點後谷歌。但它對我的問題沒有影響。

然後問題是你用來存儲/顯示字符的工具更多。你是怎麼發現這些角色出現亂碼的?在日誌記錄中?如果是這樣,它使用UTF-8嗎?或者它在日誌文件查看器/控制檯中?如果是這樣,它使用UTF-8嗎?或者它在數據庫表中?如果是這樣,它使用UTF-8嗎?或者它在數據庫管理工具中?如果是這樣,它使用UTF-8嗎?或者它在結果頁面中?如果是這樣,它使用UTF-8嗎? Etcetera ..通過上述鏈接的解決方案部分,如何讓他們一切正常。

+0

我認爲在這種情況下過濾器不是必需的。我正在製作一個西里爾(utf-8)應用程序,並且只將utf-8放置在每個jsp的ontop上。這使得它像魅力一樣工作。 – Bozho 2010-01-05 15:25:05

+1

-1:設置請求的字符編碼幾乎從不是正確的事情,因爲它只能掩蓋其他地方發生的錯誤。 – 2010-01-05 15:25:48

+0

僅適用於響應處理,是的,但不適用於請求處理。 – BalusC 2010-01-05 15:26:02

0

這是正確的行爲。 UTF-8意味着你需要Unicode字符(即非ASCII或任何> = charpoint 128)必須用兩個字節編碼。

但是,您的JSF框架應該在您的代碼能夠看到它之前將數據解碼爲Unicode字符串。所以我的猜測是你沒有指定頁面或表單的編碼,因此,你的框架只能猜測它得到了什麼。始終將acceptcharset設置爲utf-8,並將整個HTML頁面的編碼設置爲相同(使用meta標記)。

然後它應該工作。

鏈接:Tips for JSF character encoding

0

<?xml version="1.0" encoding="UTF-8" ?> 

ontop的網頁的,它應該工作的罰款。

另外:

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

在你的模板(或再次,在每一個頁面上,如果不使用模板)

目前,我正在做一個UTF-8項目,hanven't集UTF-8除了每個jsp/xhtml的頂部。

我不記得幕後究竟發生了什麼,但我認爲這條線(<?xml)的指示小面應該用什麼編碼。此行不會發送到瀏覽器。

P.S.以上是根據MyFaces的測試只(不應該的問題,但仍..)

+0

你真的不希望網頁瀏覽器進入怪癖模式。 – BalusC 2010-01-05 15:26:49

+0

這並沒有發送到瀏覽器 - 我認爲這是指導facelets如何處理編碼。 – Bozho 2010-01-05 15:28:54

+0

可以。儘管如此,他的問題也不是反應過程,而是要求處理。 – BalusC 2010-01-05 15:30:20

0

如何

<h:form id="register-form" acceptcharset="UTF-8"> 

不是真的意味着作爲一個解決方法,但如果讓所有字符工作,那麼它表明,你真正的問題是包含表單的頁面被聲明爲US-ASCII。瀏覽器通常會發送表單提交頁面的編碼,除非acceptcharset另有說明。

但是,很難診斷webapps中的編碼問題,因爲有太多潛在的失敗點,其中編碼涉及到。當你對編碼的理解如你錯誤的術語(「UTF-8字符」)所表明的那樣很差時,尤其困難。我建議你第一次閱讀The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

一旦你閱讀了這篇文章,看看錶單頁面的HTML源代碼和該頁面的HTTP頭以及表單請求,以瞭解正在使用哪些編碼。然後你應該能夠找出事情出錯的地方。

+0

-1:'acceptcharset'在MSIE中與響應編碼不匹配時很麻煩,如果設置了內容類型編碼,這也是多餘的 – BalusC 2010-01-05 15:27:54

+0

我不認爲acceptCharset也是必需的。是非常簡單的(也許要感謝facelets),並且需要的東西很少。 – Bozho 2010-01-05 15:34:24

+0

當你想允許頁面的內容類型編碼無法處理的形式的字符時,這並不是多餘的。是的,最好是改變該內容類型編碼,如果只是爲了解決MSIE bug問題,但我的意思是,這更像是一種縮小錯誤的方法,而不是一種修復方法。 – 2010-01-05 15:36:40

-2

你需要轉換爲Unicode在您的服務器端,例如,如果你使用的是GlassFish添加參數編碼默認字符集=「UTF-8」進入Glassfish的-web.xml中。爲我工作。

<parameter-encoding default-charset="UTF-8" />