@ Дуб: это слишком долго для комментария ...
Я не знаю о C # (и был бы очень удивлен: это означало бы, что они просто скопировали Java слишком много), но для Java все просто: Java была задумана еще до выхода Unicode 3.1.
Следовательно, было меньше 65537 кодовых точек, следовательно, каждая кодовая точка Unicode все еще соответствовала 16-битной, и таким образом родился Java char .
Конечно, это привело к сумасшедшим проблемам, которые все еще затрагивают программистов Java (таких как я) сегодня, когда у вас есть метод charAt , который в некоторых случаях не возвращает ни символа Unicode, ни кода Unicode, ни метод (добавлен в Java 5) codePointAt , который принимает аргумент, который не является числом кодовых точек, которое вы хотите пропустить! (вам нужно указать codePointAt номер Java char , который вы хотите пропустить, что делает его одним из наименее понятных методов в классе String).
Итак, да, это определенно дико и сбивает с толку большинство Java-программистов (большинство даже не знают об этих проблемах), и да, это по исторической причине. По крайней мере, это было оправданием, когда люди злились после этой проблемы: , но это потому, что Unicode 3.1 еще не вышел .
:)