Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用不支持的和/或多个字符集处理输入_Java_Character Encoding - Fatal编程技术网

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

在Java中使用不支持的和/或多个字符集处理输入,java,character-encoding,Java,Character Encoding,我正在编写一个Java(7SE)应用程序来接收各种基于文本的输入,并担心会遇到JRE不支持的字符集/编码(例如,该应用程序将在Linux机器上运行,但会接收每个主要操作系统上生成的文件,等等) 首先,如果InputStreamReader遇到不受支持的字符集/编码,是否有方法捕获IOException(或类似)呢 那么包含多个编码的输入呢?假设我们有4种不同类型的输入: 原始java.lang.Strings 明文(.txt)文件 Word(.docx)文件 PDF文件 如果我们正在读取其中

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

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

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

  • 原始
    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中,一旦从字节流转换为字符流,这些字符将在内存中表示,而无需任何特定编码,因此无需进行规范化,除非您将数据保存回某处。如果您打算稍后将该数据保存回文件,我强烈建议您选择一种编码并坚持使用它来存储所有数据。

我更愿意将流式输入“规范化”为单个标准化(最有可能为UTF-8)考虑到一个新的编码格式出现的情况,你必须改变实现。像UTF-8转换成标准,保持你的代码SAFANANKS @步伐(+ 1)-一个快速跟进。您提到,单个二进制流具有多个编码是非常罕见的。如果(在这里跟我开玩笑!)真的是这样呢?如果我不采取特殊措施来监控编码的变化,会发生什么<代码>IOException?或者它只是把它当作垃圾角色读入?爪哇启示录?再次感谢!如果编码在中途更改,而您没有检测到它,那么可能会发生两件事。首先,您可能会得到垃圾字符。UTF-8中的■为0xC2A2。如果您将流解码为ASCII码,那么将以ASCII码的形式读入。可能发生的第二件事(两者都可以得到)是将遇到非法的字节流。例如,如果流是UTF-8格式,并切换到ASCII,则可能会遇到0xC0FF,这在ASCII中是合法的,但在UTF-8中不合法。在这种情况下,如果您使用的是charsetDecoder,您将获得onMalformedInput操作。