簡體   English   中英

使用Java中的不受支持和/或多個字符集處理輸入

[英]Handling inputs with unsupported and/or multiple charsets in Java

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

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

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

  • Raw java.lang.String s
  • 明文( .txt )文件
  • Word( .docx )文件
  • PDF文件

如果我們正在閱讀其中一個輸入並開始遇到多個(但支持的)字符編碼,該怎么辦? JRE本身是否處理此問題,或者我是否必須擁有多個讀者,每個讀者都配置了自己的字符集/編碼?

在這種情況下,我可以將流輸入“標准化”為單個標准化(最可能是UTF-8)集/編碼嗎? 提前致謝。

要回答第一個問題,您可以創建一個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中,一旦從字節流轉換為字符流,這些字符將在沒有任何特定編碼的情況下在內存中表示,因此除非您將數據保存在某處,否則無需進行規范化。 如果您打算稍后將該數據保存回文件,那么我強烈建議您選擇一種編碼並堅持使用它來存儲所有數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM