Почему Java char использует UTF-16?

Недавно я прочитал много вещей о кодах Unicode и о том, как они развивались с течением времени, и уверен, что я также прочитал http://www.joelonsoftware.com/articles/Unicode.html.

Но я не смог найти настоящую причину, по которой Java использует UTF-16 для символа.

Например, если у меня была строка, которая содержит 1024 буквы строки символов ASCII в области видимости. Это значит 1024 * 2 bytes что равно 2KB памяти строки, которую он будет использовать в любом случае.

Таким образом, если базовый символ Java будет UTF-8, это будет всего 1 КБ данных. Даже если в строке есть какой-либо символ, для которого требуется 2 байта, например 10 символов "字", естественно, это увеличит размер потребления памяти. (1014 * 1 byte) + (10 * 2 bytes) = 1KB + 20 bytes

Результат не так очевиден 1KB + 20 bytes VS. 2KB Я не говорю об ASCII, но мое любопытство вызывает то, почему это не UTF-8, который просто заботится и о многобайтовых символах. UTF-16 выглядит как пустая трата памяти в любой строке, которая имеет много не многобайтовых символов.

Есть ли веская причина этого?

2 ответа

Решение

Одной из причин являются характеристики производительности произвольного доступа или итерации по символам строки:

Кодирование UTF-8 использует переменное число (1-4) байтов для кодирования символа Юникод. Поэтому доступ к символу по индексу: String.charAt(i) будет гораздо сложнее реализовать и медленнее, чем доступ к массиву, используемый java.lang.String,

Java использовала UCS-2 до перехода по UTF-16 в 2004/2005. Причина первоначального выбора UCS-2 в основном историческая:

Изначально Unicode был спроектирован как 16-битная кодировка символов с фиксированной шириной. Примитивный тип данных char в языке программирования Java был призван воспользоваться преимуществами этого дизайна, предоставив простой тип данных, который может содержать любой символ.

Это и рождение UTF-16 дополнительно объясняются на странице часто задаваемых вопросов по Unicode:

Изначально Unicode был спроектирован как чисто 16-битная кодировка, предназначенная для представления всех современных сценариев. (Древние сценарии должны были быть представлены с использованием символов личного пользования.) Со временем, особенно после добавления более 14 500 составных символов для совместимости с устаревшими наборами, стало ясно, что 16-разрядных кодов недостаточно для сообщества пользователей. Из этого возник UTF-16.

Как wero@wero, произвольный доступ не может быть эффективно выполнен с помощью UTF-8. Итак, все взвешено, UCS-2, казалось бы, был лучшим выбором в то время, особенно потому, что на этой стадии не было выделено никаких дополнительных символов. Это тогда оставило UTF-16 как самый простой естественный прогресс после этого.

Другие вопросы по тегам