我正在为文本解码类编写一组单元测试。我想编写一个测试,正确执行将不可映射的 input 处理为 CharsetDecoder
。但是,我很难启动一个执行此操作的字节缓冲区。示例:
CharsetDecoder decoder = Charset.forName("utf-8").newDecoder();
decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
ByteBuffer in = ?
CharBuffer out = CharBuffer.allocate(256);
CoderResult result = decoder.decode(in, out, true);
assertTrue(result.isUnmappable());
如何启动字节缓冲区(第 3 行)以通过断言(第 6 行)?
不起作用的东西:
- NULL 字符(例如\u0000 编码为 utf-8)
- 控制字符(例如\u0001 编码为 utf-8)
- 未定义的字符(例如\u2065 编码为 utf-8)
- 非字符(例如\ufdd0 编码为 utf-8)
- 私有(private)使用字符(例如\ue000 编码为 utf-8)
- 独立组合字符(例如\u0305 编码为 utf-8)。
最佳答案
我认为不可映射字符 条件仅与编码任务相关。这里,256个字符没有为iso-8859-1定义:
public void testUnmappableCharacter() {
CharsetEncoder encoder = Charset.forName("iso-8859-1").newEncoder();
CharBuffer in = CharBuffer.wrap(new char[]{256});
ByteBuffer out = ByteBuffer.allocate(1);
CoderResult result = encoder.encode(in, out, false);
System.out.println(result);
}
对于 UTF-8 解码,您唯一能够产生的是格式错误条件,因为无法对所有非法 UTF-8 代码点进行编码。
关于java - 如何为 Java CharsetDecoder 生成 'un-mappable' 输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108861/