2013-02-26 20 views
1

我正在編寫一個Java(7 SE)應用程序來攝取各種基於文本的輸入,並且擔心會遇到字符集/編碼,而JRE不會支持(例如,這個應用程序將在Linux上運行,但會攝入每個主要操作系統上生成的文件等)。在Java中處理不受支持和/或多個字符集的輸入

首先,如果InputStreamReader遇到不受支持的字符集/編碼,是否有辦法捕獲IOException(或類似的)?

那麼包含多個編碼的輸入呢?假設我們有4種不同類型的輸入:

  • java.lang.String小號
  • 明文(.txt)文件
  • 字(.docx)文件
  • PDF文件

,如果我們什麼讀取其中一個輸入,我們開始遇到多個(但支持)字符編碼? JRE本身處理這個問題,還是必須有多個閱讀器,每個閱讀器都配置了它自己的字符集/編碼?

在這種情況下,我可以將流輸入「標準化」爲單一的標準化(UTF-8最可能)集/編碼嗎?提前致謝。

+0

我希望我更願意將流式輸入「標準化」爲單個標準化(UTF-8最有可能)集合/編碼。考慮一個明確的情況,其中一些新的編碼格式來了,您必須更改實現。轉換轉換爲UTF-8標準,讓您的代碼更安全 – chiru 2013-02-26 13:27:22

回答

2

要回答您的第一個問題,您可以創建一個CharsetDecoder並指定在遇到格式錯誤的輸入時要執行的操作。

CharsetDecoder charsetDecoder = Charset.forName("utf-8").newDecoder(); 
charsetDecoder.onMalformedInput(myCustomErrorAction); 
charsetDecoder.onUnmappableCharacter(myCustomErrorAction); 
Reader inputReader = new InputStreamReader(inputStream, charsetDecoder); 

至於追趕當整個字符集不支持它看起來像一個案例:

if(Charset.isSupported(encodingSpecified)) { 
    //Normal case 
} else { 
    //Error case 
} 

我不知道多種編碼不過。我認爲單個二進制流具有多種編碼是非常不尋常的。該流將不得不有一些指示編碼改變的自定義方式。您必須一次從流中讀取一個字符,以查找該指標。如果你遇到它,你將不得不在新編碼的同一個流上創建一個新的閱讀器。

在所有情況下,在Java中,一旦從字節流轉到字符流,這些字符將在內存中表現出來,而沒有任何特定的編碼,因此不需要進行標準化,除非您保存數據返回某處。如果以後要將這些數據保存到文件中,我強烈建議您選擇一種編碼並堅持使用它來存儲所有數據。

+0

感謝@Pace(+1) - 一次快速跟進。您提到,單個二進制流具有多種編碼極其罕見。如果(只是幽默我在這裏!),它呢?如果我不採取特殊的行動來監視編碼的變化,**會發生什麼?** IOException'?或者只是將它作爲垃圾角色閱讀? Java啓示錄?再次感謝! – IAmYourFaja 2013-02-26 19:32:06

+0

如果編碼在中途變化,而您沒有檢測到,則可能會發生兩件事。首先,你可能會得到垃圾角色。 UTF-8中的¢爲0xC2A2。如果您正在將流解碼爲ASCII,那麼將按照¢讀入。可能發生的第二件事(你可以同時獲得)是會遇到非法的字節流。例如,如果流使用UTF-8並切換爲ASCII,則可能會遇到0xC0FF,這在ASCII中是合法的,但不在UTF-8中。在這種情況下,如果您使用charsetDecoder,您將獲得onMalformedInput操作。 – Pace 2013-02-26 20:21:18