Подтвердить что ты не робот

Почему Java использует модифицированный UTF-8 вместо UTF-8?

Почему Java использует измененный UTF-8 вместо стандартного UTF-8 для сериализации объектов и JNI?

Одно из возможных объяснений заключается в том, что модифицированный UTF-8 не может иметь встроенные нулевые символы, и поэтому с ним можно использовать функции, которые работают с цепочками с завершающим нулем. Есть ли другие причины?

4b9b3361

Ответ 1

Это быстрее и проще для обработки дополнительных символов (не обрабатывая их).

Java представляет символы как 16 бит char s, но unicode развился, чтобы содержать более 64K символов. Поэтому некоторые символы, дополнительные символы, должны быть закодированы в 2 char (суррогатная пара) в Java.

Строгий UTF-8 требует, чтобы кодер преобразовывал суррогатные пары в символы, затем кодировал символы в байты. Декодер должен разделить дополнительные символы на суррогатные пары.

chars -> character -> bytes -> character -> chars

Поскольку оба конца - это Java, мы можем взять некоторые ярлыки и закодировать непосредственно на уровне char

char -> bytes -> char

ни кодер, ни декодер не должны беспокоиться о суррогатных парах.

Ответ 2

Я подозреваю, что главная причина. На земле C, имея дело со струнами, может содержать встроенные NUL, что усложнит ситуацию.

Ответ 3

Существует хорошее описание модифицированного UTF-8 в Unicode Explained - Страница 306, но он не объясняет почему Изменен UTF-8.

В Java также есть очень подробное объяснение того, как поддержка Java-символов без BMP была первоначально добавлена ​​в Java: Дополнительные символы на платформе Java. Но опять же, никаких объяснений относительно почему было изменено UTF-8.

Я не думаю, что вы найдете почему, если вы не спросите непосредственно разработчиков Java.