@Oak: esta demasiado largo para un comentario ...
No sé sobre C# (y estaría muy sorprendido: que significaría que sólo copian Java demasiado mucho), pero para Java es simple: Java fue concebido antes de que saliera Unicode 3.1.
Por lo tanto, había menos de 65537 puntos de código, por lo tanto, todos los puntos de código Unicode todavía se ajustaban a 16 bits, por lo que nació el de Java.
Por supuesto, esto dio lugar a cuestiones locas que siguen afectando a los programadores de Java (como yo) de hoy, donde se tiene un método charAt la que en algún caso no volver ni un carácter Unicode, ni un punto de código Unicode y un método (añadido en Java 5) codePointAt que toma un argumento que no es el número de puntos de código que desea omitir! (debe suministrar codePointAt la cantidad de Java char que desea omitir, lo que lo convierte en uno de los métodos menos entendidos en la clase String).
Así que, sí, esto es definitivamente salvaje y confunde a la mayoría de los programadores de Java (la mayoría ni siquiera son conscientes de estos problemas) y, sí, es por razones históricas. Al menos, esa fue la excusa que surgió cuando la gente se enojó después de este problema: , pero es porque Unicode 3.1 aún no había salido.
:)
Además de mi respuesta, yo diría que .NET/C# eligió UTF-16 porque esa es la codificación "nativo" de Windows: es más fácil de Interop con Windows nativo si usted está utilizando el misma codificación –
¿Con qué fines elige una codificación? UTF-16 es una opción razonable para el manejo de cadenas en memoria, como lo es 'wchar_t', que será UTF-16 en Windows y generalmente UTF-32 en otros lugares. Pero para los protocolos en línea y el almacenamiento de archivos, UTF-8 es casi siempre la mejor opción. – bobince
@codeka: estoy de acuerdo (le di +1), pero también se podría hacer la pregunta "¿por qué la codificación nativa de Windows UTF-16 y no UTF-8?". –