UnmappableCharacterException

UnmappableCharacterException

[注意:问题经过反复研究后基本上已重新编辑]

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

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

  • 这两个类都定义了以下方法:.onUnmappableCharacter().onMalformedInput()。如果您将它们分别告诉CodingErrorAction.REPORT,它们将抛出以下两个异常之一: UnmappableCharacterException MalformedInputException

    使用CharsetEncoder,我可以生成它们两者:
  • 用一个CharBuffer喂它,其中包含两个紧随其后的高替代--MalformedInputException;
  • 用一个CharBuffer喂它,其中包含一个char(或char序列),但该编码无法表示:UnmappableCharacterException

  • 带有CharsetDecoder:
  • 用非法的字节序列喂它:MalformedInputException-容易做到;
  • UnmappableCharacterException->怎么样?

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

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

    有没有?

    最佳答案

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

    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.

    10-05 18:52