Размер символов в Java и C - PullRequest
       0

Размер символов в Java и C

14 голосов
/ 20 февраля 2012

Почему символ в Java занимает вдвое больше места для хранения, чем символ в C?

Ответы [ 5 ]

26 голосов
/ 20 февраля 2012

В Java символы 16-битные, а C - 8-битные.

Более общий вопрос: почему это так?

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

Когда C был разработан в США, ASCII там был довольно стандартным, и вам действительно нужны были только 7-битные, но с 8-ми можно было обрабатывать и некоторые не-ASCII-символы. Это может показаться более чем достаточно. Многие текстовые протоколы, такие как SMTP (электронная почта), XML и FIX, все еще используют только символ ASCII. Электронная почта и XML кодируют символы не ASCII. Двоичные файлы, сокеты и поток по-прежнему являются только 8-битными собственными байтами.

Кстати: C может поддерживать более широкие символы, но это не просто char

Когда Java была разработана, 16-битная версия казалась достаточной для поддержки большинства языков. С тех пор юникод был расширен до символов выше 65535, и Java пришлось добавить поддержку кодовых точек, которые представляют собой символы UTF-16 и могут содержать один или два 16-разрядных символа.

Таким образом, создание byte байта и char 16-разрядного значения без знака имело смысл в то время.

Кстати: если ваша JVM поддерживает -XX:+UseCompressedStrings, она может использовать байты вместо символов для строк, которые используют только 8-битные символы.

2 голосов
/ 20 февраля 2012

Поскольку Java использует Unicode, C обычно использует ASCII по умолчанию.

Существуют различные разновидности кодировки Unicode, но Java использует UTF-16, который использует одну или две 16-битные единицы кода на символ. ASCII всегда использует один байт на символ.

1 голос
/ 11 октября 2013

Java - это современный язык, появившийся в начале эпохи Юникода (в начале 90-х годов), поэтому он поддерживает Юникод по умолчанию, как и многие новые языки сегодня (например, C #). Ко времени разработки Java и многих новых фреймворков (таких как Qt) Unicode был фиксированным 16-битным типом , закодированным в UCS-2 , поэтому имело смысл использовать 16 -битные значения для символов

Конечно, позже Консорциум Unicode понял, что 16 бит недостаточно, поэтому они расширили диапазон кодовой точки Unicode до 21 бита и изменили UCS-2 на UTF-16 , чтобы избежать взлома кода, который предполагает 16-битный Unicode. Поэтому старые реализации, использующие 16-битный символ , застряли

Напротив, C - это «древний» язык, который был изобретен за десятилетия до Java, когда Unicode был далек от чего-либо. Это возраст 7-битного ASCII, поэтому C использует 8-битный символ 1 как , что достаточно для переменной char, содержащей все значения ASCII . Приходя во времена Юникода, чтобы воздержаться от взлома старого кода, они решили использовать другой тип символов, который wchar_t. Это означает, что char продолжает иметь старый размер , как в Java


Говоря о wchar_t, это было настолько непереносимо, что стандартам C и C ++ нужно было вводить новые типы символов char16_t и char32_t в своих редакциях 2011 года

Позже мы увидели появление UTF-8, который, как оказалось, превосходит UTF-16, потому что он не зависит от порядка байтов, обычно занимает меньше места, и, что важнее всего, не требует никаких изменений в стандартных функциях строки C . Большинство пользовательских функций, которые получают char*, продолжат работать без специальной поддержки Unicode


1 Строго говоря, char в C требуется только для не менее 8 бит . Смотрите На каких платформах есть что-то кроме 8-битного символа?

1 голос
/ 20 февраля 2012

Платформа Java 2 использует представление UTF-16 в массивах символов и в классах String и StringBuffer.

0 голосов
/ 20 февраля 2012

Java char - это кодированная точка Unicode в кодировке UTF-16, в то время как C в большинстве случаев использует кодировку ascii.

...