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) {
    ...
}

我很惊讶你能解决这个问题,直到我意识到你已经解决了。回答得好。