使用Java中的不受支持和/或多个字符集处理输入

时间:2013-02-26 13:18:13

标签: java character-encoding

我正在编写一个Java(7 SE)应用程序来摄取各种基于文本的输入,并担心会遇到JRE不支持的字符集/编码(例如这个应用程序将在Linux上运行框,但将摄取在每个主要操作系统上生成的文件等。)。

首先,如果IOException遇到不受支持的字符集/编码,是否可以捕获InputStreamReader(或类似字符)?

那么包含多个编码的输入呢?假设我们有4种不同类型的输入:

  • 原始java.lang.String s
  • 明文(.txt)个文件
  • Word(.docx)个文件
  • PDF文件

如果我们正在阅读其中一个输入并开始遇到多个(但支持的)字符编码,该怎么办? JRE本身是否处理此问题,或者我是否必须拥有多个读者,每个读者都配置了自己的字符集/编码?

在这种情况下,我可以将流输入“标准化”为单个标准化(最可能是UTF-8)的设置/编码吗?提前谢谢。

1 个答案:

答案 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中,一旦你从一个字节流转到一个字符流,这些字符将在没有任何特定编码的情况下在内存中表示,所以除非你要保存,否则不需要规范化数据在某处退出。如果您打算稍后将该数据保存回文件,那么我强烈建议您选择一种编码并坚持使用它来存储所有数据。