Почему персонаж в Java занимает в два раза больше места для хранения в качестве символа в C?
Размер символа в Java против C
Ответ 1
В Java символы 16-бит, а C - 8-разрядные.
Более общий вопрос: почему это так?
Чтобы узнать, почему вам нужно посмотреть историю и прийти к выводам / мнениям по этому вопросу.
Когда C был разработан в США, ASCII был довольно стандартным, и вам понадобятся только 7 бит, но с 8 вы можете обрабатывать некоторые не-ASCII-символы. Это может показаться более чем достаточно. Многие текстовые протоколы, такие как SMTP (электронная почта), XML и FIX, по-прежнему используют только символ ASCII. Электронная почта и XML кодируют символы не ASCII. Двоичные файлы, сокеты и поток по-прежнему являются только 8-разрядными байтами.
BTW: C может поддерживать более широкие символы, но это не просто char
Когда Java была разработана, 16-разрядная версия казалась достаточной для поддержки большинства языков. С тех пор unicode был расширен до символов выше 65535, и Java пришлось добавить поддержку кодовых точек, которые являются символами UTF-16, и может быть одним или двумя 16-разрядными символами.
Таким образом, для byte
байта и char
значение unsigned 16-bit значение имеет смысл в то время.
BTW: Если ваш JVM поддерживает -XX:+UseCompressedStrings
, он может использовать байты вместо символов для строк, которые используют только 8-битные символы.
Ответ 2
Поскольку Java использует Unicode, C обычно использует ASCII по умолчанию.
Существуют различные варианты кодировки Unicode, но Java использует UTF-16, который использует один или два 16-разрядных кодовых блока на символ. ASCII всегда использует один байт на символ.
Ответ 3
Платформа Java 2 использует представление UTF-16 в массивах char и в классах String и StringBuffer.
Ответ 4
Java - это современный язык, поэтому он поддерживает Unicode по умолчанию, как и многие новые языки сегодня (например, С#). Напротив, C является "древним" языком из эпохи 7-битного ASCII, поэтому по умолчанию используется 8-бит char. Когда вы приходите в Unicode раз, для того, чтобы не делать старые разрывы кода, они решили использовать другой тип символа, который является wchar_t
Ответ 5
Java char - это кодовая точка Unicode с кодировкой UTF-16, в то время как C использует кодировку ascii в большинстве случаев.