2010-06-07 26 views
7

我最近發現依賴JVM的默認編碼會導致錯誤。我應該明確地使用特定的編碼。 UTF-8使用String,InputStreams等。 我有一個巨大的代碼庫來掃描以確保這一點。有人可能會建議我採用一些比搜索整個代碼庫更簡單的方法來檢查這一點。如何確保Java程序是否使用UTF-8編碼

感謝 Nayn

+0

我閱讀帖子:http:// stackoverflow。com/questions/1749064/how-to-find-default-charset-encoding-in-java – Nayn 2010-06-07 16:21:13

+0

你是否指定了utf8以外的編碼? 默認情況下,java中的字符串是utf8,所以我在這裏沒有看到問題。 – 2010-06-07 16:35:05

+2

@Imre:無論何時您將這些字符作爲/來自期望/使用不同編碼(默認情況下)的外部源的字符進行讀取/寫入時,都會出現問題。磁盤文件系統,數據存儲(數據庫),網絡連接(HTTP)等。 – BalusC 2010-06-07 16:42:24

回答

3

不是一個直接的答案設置,但對緩解它的好工作知道在一個體面的IDE你可以只是搜索已使用的發生InputStreamReaderOutputStreamWriterString#getBytes()String(byte[]),Properties#load(),URLEncoder#encode(),URLDecoder#decode()和其中你可以通過字符集,然後相應地更新。您還想搜索FileReaderFileWriter,並將其替換爲前面提到的前兩類。誠然,這是一項乏味的任務,但值得,而且我更喜歡它依賴於enrivonmental細節。

在Eclipse例如,選擇感興趣的項目(S),命中按Ctrl + ^h,切換到標籤的Java搜索,輸入例如InputStreamReader,勾選搜索選項構造 ,選擇來源作爲唯一搜索選項,並執行搜索。

+0

+1很好的提及'InputStreamReader'等等。 – Bozho 2010-06-07 16:37:50

+1

'FileReader'是baddy。我不知道這些危險的API方法/構造函數的完整列表。 – 2010-06-07 17:08:07

4
System.getProperty("file.encoding") 

返回VM編碼爲I/O操作

你可以通過-Dfile.encoding=utf-8

+1

請參閱我在評論中提到的主題。以上屬性是特定JVM實現的內部實現細節。這個屬性在Java 1.5和1.6中的使用有所不同。 – Nayn 2010-06-07 16:28:35

+0

它不是。完整閱讀已接受的答案:)這是一個標準設置,用於確定默認字符集。 – Bozho 2010-06-07 16:32:00

+1

設置一個像這樣的屬性來糾正代碼是一種無恥的破解。 – 2010-06-07 17:07:06

0

依靠JVM 的默認編碼導致錯誤

事實上,每個人都應該指定字符集,當編碼/解碼。

如果您對所有編碼/解碼的默認全局字符集(並不總是足夠)滿意,您可以接受Bozho的答案:在JVM參數或某個靜態初始化程序中指定已知的固定缺省值。

但它是很好的做法,搜索所有的隱含字符集規格在你的代碼,並用明確的字符集編碼替換它們:一些典型的方法/類別查看:FileWriterFileReaderInputStreamReaderOutputStreamWriterString#getBytes()String(byte[])

+2

注意應該是'FileWriter'和'FileReader'不能被改變來採取指定的編碼。它們應該分別替換爲'OutputStreamWriter'和'InputStreamReader'。 – BalusC 2010-06-07 16:34:19

0

如果文件被服務器上的本機工具操縱,可能需要將編碼設置爲System.getProperty(「file.encoding」)。我遇到了兩種錯誤。

最佳做法是知道使用哪個字符集,並設置它。另外,如果文件用於連接到另一個應用程序,則應該定義使用的字符集。這可能是一個Windows代碼頁或不同的UTF格式。