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

时间:2014-02-25 17:50:11

标签: java character-encoding

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

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

  • CharsetEncoder,将char序列转换为byte序列;
  • CharsetDecoder,将byte序列转换为char序列。

这两个类都定义了以下方法:.onUnmappableCharacter().onMalformedInput()。如果你告诉他们每个人CodingErrorAction.REPORT他们将抛出以下两个例外:UnmappableCharacterExceptionMalformedInputException

使用CharsetEncoder,我可以生成两者:

  • 用含有两个高代理的CharBuffer来喂它 - > MalformedInputException;
  • 使用CharBuffer包含编码无法代表的char(或char序列)进行投放:UnmappableCharacterException

使用CharsetDecoder

  • 用非法字节序列提供它:MalformedInputException - 容易做;
  • UnmappableCharacterException - >如何?

尽管我进行了所有研究,但我还是做不到。

所有这一切尽管有played a lot with CharsetDecoder。我找不到Charset和字节序列的组合能够产生这个错误......

有没有?

2 个答案:

答案 0 :(得分:7)

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

IBM1098为例。它不能映射十六进制字节

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 attempt.

答案 1 :(得分:0)

当你向解码器提供一个字符时,解码器可以告诉一个字符不适合charset并抛出一个UnmappableCharacterException。

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