代码之家  ›  专栏  ›  技术社区  ›  IAmYourFaja

在Java中处理具有不受支持的和/或多个字符集的输入

  •  1
  • IAmYourFaja  · 技术社区  · 11 年前

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

    首先,有没有办法抓住 IOException (或类似)如果 InputStreamReader 遇到不支持的字符集/编码?

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

    • 未经加工的 java.lang.String s
    • 明文( .txt )文件
    • 单词( .docx )文件
    • PDF文件

    如果我们正在读取其中一个输入,并且开始遇到多个(但受支持的)字符编码,该怎么办?JRE是本机处理这个问题,还是我必须有多个读取器,每个读取器都配置有自己的字符集/编码?

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

    1 回复  |  直到 11 年前
        1
  •  3
  •   Pace    11 年前

    要回答您的第一个问题,您可以创建一个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中,一旦您从一个字节流到一个字符流,这些字符将在内存中表示,而不需要任何特定的编码,因此没有必要进行规范化,除非您将数据保存回某个地方。如果你打算稍后将数据保存回文件,那么我强烈建议你选择一种编码,并坚持使用它来存储所有数据。