我正在编写一个Java(7 SE)应用程序来摄取各种基于文本的输入,并担心会遇到JRE不支持的字符集/编码(例如这个应用程序将在Linux上运行框,但将摄取在每个主要操作系统上生成的文件等。)。
首先,如果IOException
遇到不受支持的字符集/编码,是否可以捕获InputStreamReader
(或类似字符)?
那么包含多个编码的输入呢?假设我们有4种不同类型的输入:
java.lang.String
s .txt
)个文件.docx
)个文件如果我们正在阅读其中一个输入并开始遇到多个(但支持的)字符编码,该怎么办? JRE本身是否处理此问题,或者我是否必须拥有多个读者,每个读者都配置了自己的字符集/编码?
在这种情况下,我可以将流输入“标准化”为单个标准化(最可能是UTF-8)的设置/编码吗?提前谢谢。
答案 0 :(得分:3)
要回答您的第一个问题,您可以创建一个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中,一旦你从一个字节流转到一个字符流,这些字符将在没有任何特定编码的情况下在内存中表示,所以除非你要保存,否则不需要规范化数据在某处退出。如果您打算稍后将该数据保存回文件,那么我强烈建议您选择一种编码并坚持使用它来存储所有数据。