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