CharsetDecoder 读取:
有两种常见的解码错误。如果输入的字节序列在此字符集中不合法,则认为输入是畸形的。如果输入的字节序列合法,但无法映射到有效的Unicode字符,则遇到了不可映射字符。
我理解畸形字符的概念,但是什么是不可映射字符?我以为Unicode包含所有可能的字符。那么,如何才能使一个合法的字节序列不能映射到Unicode字符呢?
CharsetDecoder 读取:
有两种常见的解码错误。如果输入的字节序列在此字符集中不合法,则认为输入是畸形的。如果输入的字节序列合法,但无法映射到有效的Unicode字符,则遇到了不可映射字符。
我理解畸形字符的概念,但是什么是不可映射字符?我以为Unicode包含所有可能的字符。那么,如何才能使一个合法的字节序列不能映射到Unicode字符呢?
虽然Unicode可以代表很多语言的许多字符,但它肯定不是详尽无遗的。换句话说,有一些字符集中的字符没有映射到Unicode。
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)
猜想一下...
我预计这样的值应该存在于尚未为实现填充的空块之一。该错误可能会预测将来合法字符的值,但目前不存在。Unicode所包含的字符集是一个永无止境的进展过程(有关当前正在考虑的字符,请参见proposed characters)。