Java 如何判断从网络接收/从文件读取的文本是否使用给定的编码?
我有一个文件,或者我从一个套接字读取;我读取的数据应该是使用给定字符编码的文本编码 但是,即使我指定了一个编码,结果证明它是错误的,操作还是成功了;我得到了很多Java 如何判断从网络接收/从文件读取的文本是否使用给定的编码?,java,character-encoding,Java,Character Encoding,我有一个文件,或者我从一个套接字读取;我读取的数据应该是使用给定字符编码的文本编码 但是,即使我指定了一个编码,结果证明它是错误的,操作还是成功了;我得到了很多�在我的文本中:/ 有什么方法可以触发故障吗?有 首先,一些信息:那讨厌的�角色,真的吗?嗯,是的 现在,你为什么得到这个?为了解释这一点,我们需要深入研究发生了什么 首先,“正式”定义:字符编码是定义字节流和字符流之间的双射的过程;由于它是一个双射,这意味着定义了两个操作:编码(将字符流转换为字节流)和解码(将字节流转换为字符流) 在J
�代码>在我的文本中:/
有什么方法可以触发故障吗?有
首先,一些信息:那讨厌的�代码>角色,真的吗?嗯,是的
现在,你为什么得到这个?为了解释这一点,我们需要深入研究发生了什么
首先,“正式”定义:字符编码是定义字节流和字符流之间的双射的过程;由于它是一个双射,这意味着定义了两个操作:编码(将字符流转换为字节流)和解码(将字节流转换为字符流)
在Java中,字符编码包含在;您可以使用获取编码器,使用获取解码器
当然,在解码过程中可能会发生这种情况,这也是我们感兴趣的,某个字节序列被证明是错误的,在这种情况下,CharsetDecoder
必须决定要做什么。。。这种行为取决于,它有三个值:
REPLACE
(默认值!!):用Unicode的替换字符替换任何不可映射的序列李>
忽略
:放弃所有不可映射的序列,不输出任何内容李>
报告
:在不可映射的序列上引发异常
现在,为了检测格式错误的输入并抛出错误,我们需要的是报告它们
那么,在给定InputStream
的情况下,我们如何做到这一点呢?解决方案是使用InputStreamReader
。你所要做的就是创建你的解码器
例如,如果要确保UTF-8正确,可以执行以下操作:
final CharsetDecoder decoder = StandardCharsets.UTF_8
.newDecoder().onMalformedInput(CodingErrorAction.REPORT);
try (
final InputStreamReader reader = new InputStreamReader(in, decoder);
) {
// read from the reader here
}
您希望在这里捕获的例外情况是。请注意,它继承了IOException
,因此您希望:
try (
...
) {
...
} catch (CharacterCodingException e) {
...
} catch (IOException e) {
...
}
我很惊讶你能解决这个问题,直到我意识到你已经解决了。回答得好。