如何从CharsetDecoder的.decode()生成UnmappableCharacterException?

[注意:经过大量的游戏后问题基本上重新编辑]

在Java中,您有Charset ,定义了一个字符编码。 从Charset ,您可以获得两个对象:

  • 一个CharsetEncoder ,用于将char序列转换为byte序列;
  • CharsetDecoder ,用于将byte序列转换为char序列。

这两个类都定义了以下方法: .onUnmappableCharacter().onMalformedInput() 。 如果你告诉他们每一个CodingErrorAction.REPORT他们将抛出这两个exception中的任何一个: UnmappableCharacterExceptionMalformedInputException

使用CharsetEncoder ,我可以生成它们:

  • 用一个包含两个高代理的CharBuffer提供它 – > MalformedInputException ;
  • 使用包含编码无法表示的char (或char序列)的CharBuffer提供它: UnmappableCharacterException

使用CharsetDecoder

  • 用非法字节序列提供它: MalformedInputException – 很容易做到;
  • UnmappableCharacterException – >怎么样?

尽管我所有的研究,我都无法做到。

所有这一切尽管与CharsetDecoder一起玩了很多 。 我找不到Charset和字节序列的组合能够产生这个错误……

有没有?

这只是找到一个具有不可映射的字节序列的字符集。

IBM1098 。 它无法映射hex字节

 0x80 0x81 

所以把它们放在ByteBuffer ,倒回它,然后尝试解码它。

 public class Test { public static void main(String[] args) throws CharacterCodingException { ByteBuffer buffer = ByteBuffer.allocate(8); buffer.putInt(0x80); buffer.putInt(0x81); buffer.position(0); Charset charset = Charset.forName("IBM1098"); CharsetDecoder decoder = charset.newDecoder(); decoder.decode(buffer); } } 

这引发了

 Exception in thread "main" java.nio.charset.UnmappableCharacterException: Input length = 1 at java.nio.charset.CoderResult.throwException(CoderResult.java:282) at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:816) at com.test.Test.main(Test.java:16) 

Ideone.com尝试。

当您向解码器提供字符时,解码器可以告诉字符不适合字符集并抛出UnmappableCharacterException。

向编码器提供字节数组时,假定它已正确编码。 因此,当它解码您的字节数组并获得错误的字符时,它会假定您有一个损坏的编码器或错误的输入,这会导致MalformedInputException。