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-битного символа?