CharsetEncoder接受一系列字符并对其进行编码,将其转换为字节序列。
我正在创建一个用于Java的Charset,我在理解以下内容时遇到了一些麻烦。
来自java.nio.charset.CharsetEncoder的文档:
可能的错误操作是忽略错误的输入,通过返回的CoderResult对象向调用者报告错误,或者将错误的输入替换为替换字节数组的当前值。
我想知道的是,替换字节数组是否替换了一系列错误字符,或者是否为每个错误字符添加了副本?
例如,假设字符序列为{'a', 'a', 'a'}
,替换字节序列为{0, 1}
。如果你正在使用'a'
是非法字符的字符集,你会写{0, 1, 0, 1, 0, 1}
,单独替换所有非法字符,还是只更换{0, 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来自的地方)。
简而言之,每个不可映射的角色都会被单独替换。