Почему экосистема Java использует разные кодировки символов в своем программном стеке? - PullRequest
5 голосов
/ 13 июля 2010

Например, файлы классов используют CESU-8 (иногда также называемый MUTF-8), но внутренне Java сначала использовала UCS-2, а теперь использует UTF-16. В спецификации о допустимых исходных файлах Java говорится, что минимальный соответствующий компилятор Java должен принимать только символы ASCII.

В чем причина такого выбора? Разве не имеет смысла использовать одну и ту же кодировку во всей экосистеме Java?

Ответы [ 3 ]

4 голосов
/ 13 июля 2010

ASCII для исходных файлов объясняется тем, что в то время было не разумно ожидать, что люди будут иметь текстовые редакторы с полной поддержкой Unicode.С тех пор дела улучшились, но они все еще не совершенны.Вся вещь \uXXXX в Jave по сути эквивалентна триграфам Си.(Когда C был создан, некоторые клавиатуры не имели фигурных скобок, поэтому вам приходилось использовать триграфы!)

Во время создания Java формат файла класса использовал UTF-8, а среда выполнения использовала UCS-2.Unicode имел менее 64 тыс. Кодовых точек, поэтому 16 бит было достаточно.Позже, когда в Unicode были добавлены дополнительные «плоскости», UCS-2 был заменен (в значительной степени) совместимым UTF-16, а UTF-8 был заменен на CESU-8 (отсюда и «Схема кодирования совместимости ...»).

В формате файла класса они хотели использовать UTF-8 для экономии места.Дизайн формата файла класса (включая набор инструкций JVM) был в значительной степени ориентирован на компактность.

Во время выполнения они хотели использовать UCS-2, потому что считалось, что экономия места менее важна, чем возможностьИзбегайте необходимости иметь дело с символами переменной ширины.К сожалению, этот вид имеет неприятные последствия теперь, когда это UTF-16, потому что кодовая точка теперь может принимать несколько "символов", и, что еще хуже, тип данных "char" теперь является своего рода неправильно названным (он больше не соответствует символу, в общем, новместо этого соответствует кодовой единице UTF-16).

4 голосов
/ 13 июля 2010

MUTF-8 для эффективности, UCS2 для истерического изюма.:)

В 1993 году UCS2 был Unicode;все думали, что 65536 символов должно хватить для всех.

Позже, когда стало ясно, что на самом деле в мире очень много языков, было слишком поздно, не говоря уже об ужасной идее,переопределить 'char', чтобы он был 32-битным, поэтому вместо этого был сделан выбор в основном обратно совместимый.

Таким образом, что это очень похоже на отношения между ASCII и UTF-8, строки Java, которые не выходят за пределы исторических границ UCS2, немного идентичны их представлению UTF16.Только когда вы раскрашиваете за пределами этих линий, вы начинаете беспокоиться о суррогатах и ​​т. Д.

2 голосов
/ 13 июля 2010

Кажется, это общая проблема разработки программного обеспечения. Ранний код - это один стандарт, который обычно проще всего реализовать на момент его создания, затем более поздние версии добавляют поддержку более новых / лучших / менее распространенных / более сложных стандартов.

Минимальный компилятор, вероятно, должен принимать только ASCII, потому что это то, что используют многие обычные редакторы. Эти редакторы могут быть не идеальны для работы с Java и далеко не полностью интегрированной IDE, но часто подходят для настройки одного исходного файла.

Java, похоже, пытался установить планку выше и обрабатывать наборы символов UTF, но они также оставили эту опцию ASCII 'bailout' на месте. Я уверен, что на каком-то заседании комитета есть записи, объясняющие почему.

...