解码错误有两种常见类型。如果输入字节序列对于此字符集不合法,则输入被视为格式错误。如果输入字节序列合法但无法映射到有效的Unicode字符,则遇到不可映射的字符。
我理解畸形字符的概念,但是一个不可映射的字符意味着什么?我认为Unicode包含所有可能的字符。那么合法的字节序列怎么可能无法映射到Unicode字符呢?
答案 0 :(得分:4)
虽然Unicode可以代表大量语言的大量字符,但它肯定不是详尽无遗的。换句话说,有些字符集的字符没有映射到Unicode。
答案 1 :(得分:0)
只是一个猜测......
我希望这个值存在于尚未为实现填充的空块之一中。该错误可能预期将来会成为合法字符的值,但目前不存在。 Unicode包含的字符集是一项可能永远无法完成的工作(有关当前正在考虑的字符,请参阅proposed characters)。
答案 2 :(得分:0)
据我所知,UTF-8(或ISO-8859-1)中没有不可映射的字节序列。其他字符集的确具有不可映射的字节序列。 this answer to a different question中给出的示例表明IBM1098
有一些。具体来说,0x80
,0x81
和0xCF
是不可映射的。
可以对此进行如下测试:
public static void main(String[] args) throws CharacterCodingException {
Charset.forName("IBM1098").newDecoder().onUnmappableCharacter(CodingErrorAction.REPORT)
.decode(ByteBuffer.allocate(4).putInt(0x80).rewind());
}
运行以上命令将抛出UnmappableCharacterException
:
Exception in thread "main" java.nio.charset.UnmappableCharacterException: Input length = 1
at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:275)
at java.base/java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:813)
at com.example.FindUnmappableCharacter.main(FindInvalidCharacters.java:27)