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

fge*_*fge 2 java character-encoding

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

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

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

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

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

  • CharBuffer含有两个高代理的方式喂它- > MalformedInputException;
  • 用一个CharBuffer包含编码不能代表的char(或char序列)来提供它:UnmappableCharacterException.

CharsetDecoder:

  • 用非法的字节顺序喂它:MalformedInputException- 容易做;
  • UnmappableCharacterException - >怎么样?

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

所有这一切尽管已经玩了很多CharsetDecoder.我找不到Charset能够产生这个错误的字节序列组合......

有没有?

Sot*_*lis 7

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

举个例子吧IBM1098.它无法映射十六进制字节

0x80
0x81
Run Code Online (Sandbox Code Playgroud)

所以把它们放进去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);
    }   
}
Run Code Online (Sandbox Code Playgroud)

这引发了

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)
Run Code Online (Sandbox Code Playgroud)

Ideone.com尝试.