如何从CharsetDecoder的.decode()生成UnmappableCharacterException?
[注意:经过大量的游戏后问题基本上重新编辑]
在Java中,您有Charset
,定义了一个字符编码。 从Charset
,您可以获得两个对象:
- 一个
CharsetEncoder
,用于将char
序列转换为byte
序列; -
CharsetDecoder
,用于将byte
序列转换为char
序列。
这两个类都定义了以下方法: .onUnmappableCharacter()
和.onMalformedInput()
。 如果你告诉他们每一个CodingErrorAction.REPORT
他们将抛出这两个exception中的任何一个: UnmappableCharacterException
和MalformedInputException
。
使用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。