Как я могу сгенерировать ‘un-mappable’ входные данные для Java CharsetDecoder?

#java #text #character-encoding #nio

#java #текст #кодировка символов #nio

Вопрос:

Я пишу набор модульных тестов для класса декодирования текста. Я хотел бы написать тест, который корректно выполняет обработку un-mappable входных данных для 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)?


Вещи, которые не работают:

  • Нулевые символы (например, u0000, закодированный как utf-8)
  • Управляющие символы (например, u0001, закодированный как utf-8)
  • Неопределенные символы (например, u2065, закодированный как utf-8)
  • Не символы (например, ufdd0, закодированный как utf-8)
  • Символы частного использования (например, ue000, закодированный как utf-8)
  • Автономное объединение символов (например, u0305, закодированный как utf-8).

Комментарии:

1. Вы проводите модульное тестирование класса JDK CharsetDecoder?

2. Я использую CharsetDecoder класс внутри своего собственного класса. Я просто хочу сгенерировать указанный вывод из CharsetDecoder , чтобы проверить, как ведет себя мой класс.

Ответ №1:

Я думаю, что условие неперемещаемого символа применимо только для задач кодирования. Здесь 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 не могут быть закодированы.

Комментарии:

1. «условие unmappable character применимо только для задач кодирования» — я тоже задавался этим вопросом. Но если это так, зачем вообще добавлять onUnmappableCharacter метод?

2. Правильно. Поэтому я предполагаю, что могут существовать некоторые кодировки, для которых некоторые символы не могут быть сопоставлены с Unicode 4.0. Я не думаю, что UTF-8 является такой кодировкой.