2011-11-21 64 views
1

我正在研究一個Java Web應用程序,它現在處於開發的最後階段,其餘要做的事情之一就是本地化。我們爲每個受支持的語言環境使用屬性文件。 我發現的問題是一些unicode字符在Web瀏覽器中沒有正確顯示。網頁在charset元標記中指定了UTF-8編碼,並且瀏覽器已正確檢測到它(在Firefox視圖 - >字符編碼中,似乎選擇了正確的編碼)。我相信這個問題來自這樣一個事實,即當應用程序將文本顯示爲UTF-8時,屬性文件保存爲ISO * xxxx編碼,這恰好是一些eclipse默認設置。Java屬性文件本地化和字符編碼問題

我發現了一個類似的問題在這裏:Java properties UTF-8 encoding in Eclipse該通知:我安裝的資源包插件。我安裝並使用插件來編輯相應的屬性,但我仍然有問題。

是否有一個快速的解決方案(我的意思是不會造成應用程序太多變化的解決方案,因爲它是在基本完成階段),將解決我遇到的問題。

也許我應該提一下,我正在開發和使用Firefox 7.提前 感謝Ubuntu下的Linux操作系統觀察的問題。

編輯: 我沒有提到的一個重要問題。我的用戶界面是用GWT編寫的,而且這些屬性由一個接口公開,這個接口在GWT用來在內部創建該接口的實現並鏈接到相應屬性的getter上有註釋。所以我想我對屬性如何實際讀取沒有太多的控制,或者至少我不知道如何在GWT中進行操作。

+1

也許嘗試將某些屬性在檢索到時回送到控制檯或日誌文件。查看從屬性文件實際獲得的內容。 –

+0

我已經爲我的案例添加了一些說明。我正在使用自動解析屬性的GWT,似乎我無法控制屬性文件如何實際讀取。 –

+0

[Eclipse中的Java屬性utf8編碼問題]的可能重複(http://stackoverflow.com/questions/863838/problem-with-java-properties-utf8-encoding-in-eclipse) – Raedwald

回答

3

這裏有兩個完全不同的問題:

  • 保存在正確的編碼的屬性文件?如果您在eclipse中編輯它們,則必須在項目屬性中設置文本文件編碼。請注意,此設置保存在項目的.settings子目錄中。
  • 用於讀取屬性文件的正確編碼是什麼?如果您在代碼中閱讀它們,請務必使用InputStreamReader來設置編碼。如果它們被某個框架讀取,則必須查看其API和配置以查看是否可以指定編碼。

我建議避免使用unicode轉義,如果可能的話。

+0

我沒有在代碼中手動讀取屬性。我創建了一個接口,通過註釋獲取它們到接口的getter - 至少這就是我被告知GWT使用屬性的方式。我沒有自己編寫代碼,我也不太熟悉GWT中的屬性,所以我不知道實際使用的編碼是什麼。但我確信一件事 - 屬性文件是使用eclipse IDE的默認值創建的,並且團隊中的任何人都無需手動更改其編碼。所以,他們都使用ISO 8859-1。 –

+1

@Ivaylo:這是你必須改變的第一件事 –

+2

@Ivaylo:請注意,根據谷歌自己的文檔,GWT實際上*期望*屬性文件是UTF-8!所以這就是所有*你必須改變。 http://code.google.com/intl/de-DE/webtoolkit/doc/latest/tutorial/i18n.html –

4

Java properties files是ISO 8859-1(拉丁1)編碼。其他字符必須使用轉義的Unicode來表示。

所以請不要輸入Unicode字符拉丁文1的外部直接進入你的本地化文件。這些字符應該以Unicode轉義字符的形式輸入。

如果您有一堆UTF-8(或其他)編碼的屬性文件,則可以使用JDK中的native2ascii工具將這些文件翻譯爲拉丁語1轉義的unicode。另外,Ant有一個native2ascii task

其他海報正指出解決這個問題的方法。但個人而言,我更願意堅持使用屬性資源文件中的標準編碼 - 這樣它就可以處理所有事情。沒有什麼能阻止你用UTF-8編碼創建你的文件,並將它們轉換爲Latin 1轉義Unicode作爲你構建的一部分(例如Ant任務)。

+0

是的,我也讀過使用默認編碼以外的屬性文件不是一個好主意。你碰巧知道資源包插件是否使用native2ascii工具在內部使用非Unicode字符,或者我應該手動轉義unicode符號? –

+0

@Ivaylo:請注意,這是過時的信息。自Java 6以來,有一個採用Reader參數的Properties.load()方法,允許使用任何你喜歡的編碼。當然,如果你的屬性文件是由某個框架加載而不是在你自己的代碼中加載的,那麼這個特性對你來說可能毫無用處。 –

+0

@Micheal另一個這樣的框架的例子 - [java.util.ResourceBundle](http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html),以及任何構建於此的框架。 – sudocode

1

我也遇到過同樣的問題。我通過寫我自己的Control延伸java.util.ResourceBundle.Control克服了這個問題。在將資源束作爲特徵文件讀取時,重寫以包括相關字符集的重要方法是參數。

雖然不難;我擁有的方法很久沒有做到了。

另一種選擇是使用cal10n(http://cal10n.qos.ch/),但這可能需要進行重要的改進。

+0

您是否碰巧知道資源包插件是否在內部爲非Unicode字符使用native2ascii工具,或者我應該手動轉義unicode符號? –

+0

不熟悉eclipse的資源包插件。抱歉。 –

+0

不用擔心,我會早晚找到手動:) –

2

根據this GWT localization page(這是一個教程使用由您指的是更新後的答案標註方法本地化),它說

編碼國際字符集

當國際化你的應用程序接口,請記住 您支持的語言可能包含不在ASCII 字符集中的字符。因此,無論是在HTML主機頁面 (StockWatcher.html)還是包含 翻譯的Java屬性文件中,都必須將編碼設置爲UTF-8。

並在標題下的一個例子 「創建StockWatcherConstant_de.properties」,它說:

更改文件的編碼設置爲UTF-8。

選擇文件,然後從Eclipse菜單欄中選擇File> Properties或右鍵單擊。

Eclipse打開屬性窗口。

在文本文件編碼中,選擇其他UTF-8。應用並保存更改。

注:根據您的 Eclipse配置,當你應用更改,你可能會得到這樣 警告:在內容類型 (ISO-8859-1)定義的編碼UTF-8的衝突。你是否想要設置它?您可以忽略 警告並應用更改。

+0

也感謝你,雖然我已經閱讀了Michael Borgwardt的回答的最後評論,並在注意到你的答案之前接受了它。 –