#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 является такой кодировкой.