CharsetEncoder - 无法映射的字符替换

时间:2014-07-19 05:30:49

标签: java character-encoding

CharsetEncoder接受一系列字符并对其进行编码,将其转换为字节序列。

我正在创建一个用于Java的Charset,我在理解以下内容时遇到了一些麻烦。

来自java.nio.charset.CharsetEncoder的文档:

  

可能的错误操作是忽略错误的输入,通过返回的CoderResult对象向调用者报告错误,或者将错误的输入替换为替换字节数组的当前值。

我想知道的是,替换字节数组是否替换了一系列错误字符,或者是否为每个错误字符添加了副本?

例如,假设字符序列为{'a', 'a', 'a'},替换字节序列为{0, 1}。如果你正在使用'a'是非法字符的字符集,你会写{0, 1, 0, 1, 0, 1},单独替换所有非法字符,还是只更换{0, 1},替换非法字符序列?

我知道那些实际上不是字节文字,而是整数。请继续使用它。我认为增加一吨演员表会让人更难以理解。

我很想通过角色来做这件事,但与此同时,用一个(可能的,但可能不是)非常长的字节序列替换一个字符只是感觉很奇怪。

1 个答案:

答案 0 :(得分:1)

我终于回到了这里,所以我决定测试一下。我写了一些代码来测试它,如下所示,没有进口。

public class Main {

    public static void main(String[] args) throws CharacterCodingException {
        CharBuffer chars = CharBuffer.wrap(new char[] {'ÿ', 'ÿ', 'ÿ'});
        CharsetEncoder encoder = StandardCharsets.US_ASCII.newEncoder();
        encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
        ByteBuffer bytes = encoder.encode(chars);
        bytes.position(0);
        while(bytes.hasRemaining()) {
            System.out.print(bytes.get() + " ");
        }
    }
}

运行它,我得到了输出:

  

63 63 63

因此,三个连续的不可映射字符导致替换字节数组的三个副本。通常,默认替换是等同于问号(63s来自的地方)。

简而言之,每个不可映射的角色都会被单独替换。