Struts2中文本地化問題
案例1:屬性有特殊字符的文件
屬性文件存儲用戶名,密碼信息,並以中文字符提交。此屬性文件以UTF-8格式創建的,但內容不使用 native2ascii 編碼。
讓我們試著通過一些UI標簽,來顯示中國漢字。查看頁麵聲明為UTF-8格式的HTML元標記來顯示。
... <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> ... <s:form action="validateUser"> <s:textfield key="global.username" name="username"/> <s:password key="global.password" name="password"/> <s:submit key="global.submit" name="submit" /> <div>Testing 1 : <s:property value="getText('global.username')" /></div> <div>Testing 2 : <s:text name="global.password" /></div></br/> </s:form> ... <s:url id="localezhCN" namespace="/" action="locale" > <s:param name="request_locale" >zh_CN</s:param> </s:url> ... <s:a href="%{localezhCN}" >Chinese</s:a> ...
結果
<s:textfield key="global.username" name="username"/> <s:password key="global.password" name="password"/> Testing 2 : <s:text name="global.password" />
深入到 TextProvider.getText()的源代碼後,它使用的資源 bundle.getString()來從資源包檢索的消息,所以不正確的消息是合理的。但是,為什麼“s:text“, “s:textfield” 和 “s:password” 能夠正確顯示了中文的消息,為什麼“s:submit”會失敗?在有太多的問題,讓我們看看示例2...
案例2:有特殊字符的屬性文件(編碼)
這一次,屬性文件使用native2ascii工具處理中國漢字的編碼正確。
結果如下所示:
其結果是完全逆轉,現在 “s:submit” 和 “getText()” 是能夠正確地顯示它,但其他UI組件失敗。 這裡是按預期方式工作的,因為在Struts 2推薦使用getText(),以顯示國際化或本地化的消息。問題是,為什麼“s:submit”會不同呢?
Struts2..哪裡有問題?
這裡有幾個問題:
-
為什麼 s:submit 有如此不同的效果?
- 對國際化應該是非常簡單的,為什麼在Struts 2有這種問題? 或者我們誤解了Struts2 國際化如何工作了?
- 為什麼有這麼多的方式來顯示來自資源包的消息?為什麼不直接組織成一個方法? 在Struts1,隻需使用“bean:message”,為什麼Struts 2中它看起來很複雜?
- Struts2的支持XML資源包? 我們可能不太喜歡用native2ascii工具對數據進行編碼為UTF-8格式,它使屬性文件不可讀。 Apache Wicket的在這個問題做了很好的工作,可能是在Struts 2中吸取教訓。
-
那麼,如何正確地在 Struts2 中顯示中國漢字?
<s:text name="global.username"/> <s:property value="getText('global.username')"/>
然而,這僅適用於英國或一些“英語狀(歐洲)” 的字符,如法文,德文。但對中文或日文,這兩種方法將返回完全不同的輸出。真的不知道Struts2的本地化該怎麼辦了。
解決辦法
<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>
在Struts2,meta標簽不起作用,我們應該把 <%@ page contentType=”text/html;charset=UTF-8″ %>標簽放在頁麵的第一行。例如下麵的代碼片斷:
<%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> </head> ...
結果顯示如下:
回答之前的問題
-
為什麼 s:submit 有如此不同的效果?A: 暫無評論
-
對國際化應該是非常簡單的,為什麼在Struts 2有這種問題? 或者我們誤解了Struts2 國際化如何工作了?A:確保把<%@ page contentType=”text/html;charset=UTF-8″ %>” 放在頁麵的第一行。
-
為什麼有這麼多的方式來顯示來自資源包的消息?為什麼不直接組織成一個方法? 在Struts1,隻需使用“bean:message”,為什麼Struts 2中它看起來很複雜?A: s:text, key, getText(), name… ,所有的都能夠正確地顯示中文或UTF-8編碼的數據,隻要確保把正確的“字符集”放在視圖頁麵中。
-
Struts2的支持XML資源包? 我們可能不太喜歡用native2ascii工具對數據進行編碼為UTF-8格式,它使屬性文件不可讀。 Apache Wicket的在這個問題做了很好的工作,可能是在Struts 2中吸取教訓。A:希望在Struts2的下一版本可以支持在XML資源包。
-
那麼,如何正確地在 Struts2 中顯示中國漢字?A: 看看上頁的解決辦法
參考
- http://www.gitbook.net/java/java-convert-chinese-character-to-unicode-with-native2ascii.html
- http://forums.sun.com/thread.jspa?threadID=5185040
- http://www.coderanch.com/t/452139/Struts/applicationresources-properties-utf-characters#2013557
- http://struts.apache.org/2.1.8/docs/localization.html
- http://hxzon00.blog.163.com/blog/static/10489241620088121449163/