UnmappableCharacterException是什么意思?

4

CharsetDecoder 读取:

有两种常见的解码错误。如果输入的字节序列在此字符集中不合法,则认为输入是畸形的。如果输入的字节序列合法,但无法映射到有效的Unicode字符,则遇到了不可映射字符

我理解畸形字符的概念,但是什么是不可映射字符?我以为Unicode包含所有可能的字符。那么,如何才能使一个合法的字节序列不能映射到Unicode字符呢?

3个回答

4

虽然Unicode可以代表很多语言的许多字符,但它肯定不是详尽无遗的。换句话说,有一些字符集中的字符没有映射到Unicode。


0
据我所知,UTF-8(或ISO-8859-1)中没有无法映射的字节序列。其他字符集可能会有无法映射的字节序列。这个不同问题的答案中给出的示例显示{{link2:IBM1098}}有一些无法映射的字节序列。具体来说,0x800x810xCF是无法映射的。

可以按以下方式进行测试:

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)

0

猜想一下...

我预计这样的值应该存在于尚未为实现填充的空块之一。该错误可能会预测将来合法字符的值,但目前不存在。Unicode所包含的字符集是一个永无止境的进展过程(有关当前正在考虑的字符,请参见proposed characters)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接