Почему Java использует UTF-16 для внутреннего представления строк?

29

Я бы предположил, что причина была быстрой: массив похож на доступ к символу по индексу, но некоторые символы не помещаются в 16 бит, поэтому он не будет работать ...

Так что если вам все равно приходится работать с особыми случаями, почему бы просто не использовать UTF-8?

mrpyo
источник
4
Что-то спросить у разработчиков Java, а не у сообщества в целом. Голосование закрывать как не конструктивное.
Одед
16
@Oded: абсолютно неоправданно, как показывает ответ DeadMG.
Майкл Боргвардт
Я в замешательстве: я был почти уверен, что на этот вопрос уже был дан ответ (и здесь, и на SO), но я не могу найти дубликаты.
Йоахим Зауэр
Для истерического изюма. Смотрите utf8everywhere.org
Павел Радзивиловский

Ответы:

47

Потому что раньше это был UCS-2 , который был хорошим 16-битным фиксированной длиной. Конечно, 16 бит оказалось недостаточно. Они модифицировали UTF-16 сверху.

DeadMG
источник
6
Вот цитата из FAQ по Unicode : Originally, Unicode was designed as a pure 16-bit encoding, aimed at representing all modern scripts. (Ancient scripts were to be represented with private-use characters.) Over time, and especially after the addition of over 14,500 composite characters for compatibility with legacy sets, it became clear that 16-bits were not sufficient for the user community. Out of this arose UTF-16.На момент выпуска Java UTF-16 еще не появился, и UTF-8 не был частью стандарта Unicode.
Малкольм
20
UCS-2 - это технический термин, а не модное слово.
DeadMG
14

Для основной части, ради простого и простого будущего. Была ли это ошибочная причина и неправильный путь решения - это другой вопрос.

В этом документе вы можете увидеть некоторые причины их проектных решений по поводу перехода на 2004 г. на Java 5 и UTF-16, что также объясняет некоторые недостатки: дополнительные символы в платформе Java и посмотрите, почему экосистема Java использует разные кодировки по всему стеку? ,

Для получения более подробной информации об ловушках использования UTF-16 и о том, почему UTF-8, вероятно, будет лучшим вариантом в целом, см. Следует ли считать UTF-16 вредным? и UTF-8 Везде манифест.

haylem
источник
8
+1 за ссылку на "Должен ли UTF-16 считаться вредным?" вопрос. Недавно я обнаружил манифест UTF-8 Everywhere, и теперь я уверен, что полностью убежден. Что бы это ни стоило, хотя в Java это не так, я вполне уверен, что Windows работает намного хуже.
Даниэль Приден
5
Что ж, неудивительно, что Windows ошиблась : они сделали переход на Unicode ранее, поэтому у них было меньше правильных вариантов и меньше опыта. Ява получила позже, поняла более правильно , но все же несколько неправильно. Теперь оба должны жить со старыми, некорректными в общем смысле API, которые они должны поддерживать.
Йоахим Зауэр
4
Это жизнь в мире программного обеспечения, вы должны делать выбор, не имея всех данных, и когда вы ошибаетесь, вы вынуждены долго жить с последствиями. :-)
Брайан Кноблаух
2
Интересно, что повлияло бы на производительность stringсоздания «специального» типа в Java (во многом как Arrayесть), а не того, чтобы Stringбыть «обычным» классом, который содержит ссылку на «обычный» массив, содержащий фактические символы. В зависимости от того, как сгенерирована строка, UTF-8, UTF-16 или даже UTF-32 могут быть наиболее эффективным способом ее хранения. Я не думаю, что есть какой-то особенно эффективный способ для «обычного» класса Stringобрабатывать несколько форматов, но «специальный» тип с поддержкой JVM мог бы.
суперкат
@supercat: У меня нет точного ответа на этот вопрос, но у меня есть соответствующий ответ на этот вопрос. :) На самом деле не относится к подходу специального типа, но обсуждается потенциальная выгода от упорядоченных строк.
Хайлем