UnmappableCharacterException是什么意思?

时间:2009-06-26 18:18:38

标签: java unicode character-encoding

CharsetDecoder读到:

  

解码错误有两种常见类型。如果输入字节序列对于此字符集不合法,则输入被视为格式错误。如果输入字节序列合法但无法映射到有效的Unicode字符,则遇到不可映射的字符

我理解畸形字符的概念,但是一个不可映射的字符意味着什么?我认为Unicode包含所有可能的字符。那么合法的字节序列怎么可能无法映射到Unicode字符呢?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

只是一个猜测......

我希望这个值存在于尚未为实现填充的空块之一中。该错误可能预期将来会成为合法字符的值,但目前不存在。 Unicode包含的字符集是一项可能永远无法完成的工作(有关当前正在考虑的字符,请参阅proposed characters)。

答案 2 :(得分:0)

据我所知,UTF-8(或ISO-8859-1)中没有不可映射的字节序列。其他字符集的确具有不可映射的字节序列。 this answer to a different question中给出的示例表明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)