1.UTF-8
原來用慣了GBK,被大家一再慫恿,才下定決心整個項目換用UTF-8編碼。
編碼問題幾乎與所有國內Java項目相伴而生,不同內核的Linux、英文版日文版的WindowsXP總是讓GBK很頭痛,而改用UTF-8后,忽然就輕爽了,UTF-8,全世界語系連馬爾代夫語都有自己的座位,實在找不到理由為什么還要用只支持大中華的GBK。
而且Springside也成了一個帶有大量UTF-8中文注釋的項目。
原GBK項目的轉換方法
把自己當成車衣廠女工,機械的使用UltraEdit和EditPlus的轉換功能,忙活一兩個小時,怎么都可以轉完所有文件了。
其中UltraEdit的轉換方法是文件--〉轉換--〉ASCII to UTF-8(Unicode編輯)。最好在Advanced-〉本地代碼頁那里也設一下UTF-8。
然后就可以用設了UTF-8選項的IDE如IDEA,Eclipse直接編輯了。
2.國際化 I18N
后臺的menu.jsp 和 editBook.jsp 還有業務異常類,演示了i18N的應用。
2.1 i18N基礎
1.編寫messages.zh_CN.properties
用中文寫完后,用java帶的native2ascii.exe或者ant的native任務把它轉成非人類的Unicode編碼。
2.在純Java API里,國際化是這樣做的:
ResourceBundle rb = ResourceBundle.getBundle("messages");
String welcome = rb.getString("welcome");
String welcomeCalvin = MessageFormat.format(welcome,new
String[]{"calvin"});
第一二句從classpath里找到messages_zh_CN.properties,讀出"歡迎你,{0}"字樣。
第三局把上文格式化成"歡迎你,calvin"
3.在Servlet環境下,國際化是這樣做的

則靠<fmt:message>tag
<%@ taglib uri="
<fmt:message key="welcome"/>
可以用context-param來定義默認的properties文件
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>messages</param-value>
</context-param>
不過這樣定義的缺點是只能定義一個文件,如果所有信息都集中在一個文件會好長,而如果有多個properties,就惟有在頁面用<fmt:bundle>綁定了。
2.2 Spring的messageSource增強
Spring增加了MessageSource的概念
一是ApplicationContext將充當一個單例的角色,不再需要每次使用i18時都初始化一次ResourceBundle
二是可以代表多個Resource Bundle.
在ApplicationContext的定義文件中,增加如下節點:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value= "messages"/>
</bean>
在pure Java中
context.getMessage("welcome", null, LocaleContextHolder.getLocale())
而經Spring MVC JSTL ViewResolver調用的JSP,<fmt:message>將繼續發揮它的功效。
不過這里挺麻煩的,第一如果不是從MVC JSTL轉的,messageSource的定義就會失效。而如果定義了<context-param>,則messageSource的定義又會失效.......
還有,<spring:message> 雞肋一塊,因為它如果找不到key對應的就會拋異常,好恐怖。
還還有,spring還有有趣的theme機制,和i18n一樣的原理,解決了"做成圖片的文字"的國際化,讓不同語言的美術字圖片的路徑分別定義在theme_zh_CN.properties和theme_en_US.properties里面。