[注意:经过大量的游戏后问题基本上都被重新编辑]
在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
和字节序列的组合能够产生这个错误......
有没有?
答案 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)
答案 1 :(得分:0)
当你向解码器提供一个字符时,解码器可以告诉一个字符不适合charset并抛出一个UnmappableCharacterException。
当您向编码器提供字节数组时,假定它已被正确编码。因此,当它解码你的字节数组并得到一个坏字符时,它假定你有一个损坏的编码器或错误的输入,这会导致MalformedInputException。