[注意:问题经过反复研究后基本上已重新编辑]
在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.