@オーク:コメントするには長すぎます...
私はC#について知りません(そして本当に驚かれることでしょう:それは彼らがJavaをコピーしすぎたことを意味します)が、Javaの場合それは単純です:JavaはUnicode3.1が出る前に考案されました。
したがって、65537未満のコードポイントがあり、すべてのUnicodeコードポイントはまだ16ビットに適合していたため、Java文字が生まれました。
もちろん、これは今日でもJavaプログラマー(私のような)に影響を与えているクレイジーな問題につながりました。ここでは、メソッドcharAtがあり、場合によってはUnicode文字もUnicodeコードポイントも返さず、メソッド(Java 5で追加)codePointAtスキップしたいコードポイントの数ではない引数を取ります!(スキップするJava文字の数をcodePointAtに指定する必要があります。これにより、Stringクラスで最も理解されていないメソッドの1つになります)。
だから、うん、これは間違いなくワイルドで、ほとんどのJavaプログラマーを混乱させます(ほとんどはこれらの問題にさえ気づいていません)、そして、うん、それは歴史的な理由によるものです。少なくとも、それはこの問題の後で人々が怒ったときに思いついた言い訳でした:しかしそれはUnicode3.1がまだ出ていなかったからです。
:)