¿Por qué Java usa UTF-16 para la representación interna de cadenas?

29

Me imagino que la razón fue rápida, como acceso de matriz al carácter en el índice, pero algunos caracteres no caben en 16 bits, por lo que no funcionaría ...

Entonces, si de todos modos tiene que manejar casos especiales, ¿por qué no usar UTF-8?

mrpyo
fuente
44
Algo que preguntar a los diseñadores de Java, no a la comunidad en general. Votar para cerrar como no constructivo.
Finalizado el
16
@Oded: absolutamente injustificado, como muestra la respuesta de DeadMG.
Michael Borgwardt
Estoy confundido: estaba bastante seguro de que esta pregunta ya había sido respondida (tanto aquí como en SO), pero no puedo encontrar los duplicados.
Joachim Sauer el
Para pasas histéricas. Ver utf8everywhere.org
Pavel Radzivilovsky

Respuestas:

47

Porque solía ser UCS-2 , que era un bonito de 16 bits de longitud fija. Por supuesto, 16 bits resultó no ser suficiente. Se adaptaron UTF-16 en la parte superior.

DeadMG
fuente
66
Aquí hay una cita de las preguntas frecuentes de Unicode : Originally, Unicode was designed as a pure 16-bit encoding, aimed at representing all modern scripts. (Ancient scripts were to be represented with private-use characters.) Over time, and especially after the addition of over 14,500 composite characters for compatibility with legacy sets, it became clear that 16-bits were not sufficient for the user community. Out of this arose UTF-16.en el momento del lanzamiento de Java, UTF-16 aún no ha aparecido, y UTF-8 no era parte del estándar Unicode.
Malcolm
20
UCS-2 es un término técnico, no una palabra de moda.
DeadMG
14

En su mayor parte, por el simple y simple futuro. Si fue una razón equivocada y la forma incorrecta de hacerlo es una pregunta diferente.

Puede ver algunas razones detrás de algunas de sus decisiones de diseño en este documento sobre el cambio de 2004 a Java 5 y UTF-16, que explica algunas de las deficiencias también: Caracteres suplementarios en la plataforma Java , y vea por qué utiliza el ecosistema Java diferentes codificaciones en toda su pila? .

Para obtener más detalles sobre las trampas del uso de UTF-16, y por qué es probable que UTF-8 sea una mejor opción en general, consulte ¿Debe considerarse UTF-16 como dañino? y el manifiesto UTF-8 Everywhere .

haylem
fuente
8
+1 por vincular a "¿Debería UTF-16 considerarse perjudicial?" pregunta. Recientemente descubrí el manifiesto UTF-8 Everywhere y creo que ahora estoy bastante convencido. Por lo que vale, aunque Java se equivocó, estoy bastante convencido de que Windows lo hizo mucho peor.
Daniel Pryden
55
Bueno, no es una sorpresa que Windows se haya equivocado más : hicieron el cambio a Unicode antes, por lo que tenían menos opciones correctas y menos experiencia. Java llegó más tarde, lo hizo más bien , pero todavía algo mal. Ahora ambos tienen que vivir con API antiguas, incorrectas en el sentido general que deben seguir admitiendo.
Joachim Sauer
44
Así es la vida en el mundo del software, debes tomar decisiones sin tener todos los datos y, cuando te equivocas, puedes vivir con las consecuencias durante mucho tiempo. :-)
Brian Knoblauch
2
Me pregunto cuáles serían las implicaciones de rendimiento de hacer stringun tipo "especial" en Java (muy parecido a lo que Arrayes), en lugar de Stringser una clase "ordinaria" que tiene una referencia a una matriz "ordinaria" que contiene los caracteres reales. Dependiendo de cómo se genera una cadena, UTF-8, UTF-16 o incluso UTF-32 pueden ser la forma más eficiente de almacenarla. No creo que haya una forma particularmente eficiente para que una clase "ordinaria" Stringmaneje múltiples formatos, pero un tipo "especial" con soporte JVM podría.
supercat
@supercat: No tengo exactamente una respuesta precisa para eso, pero tengo una respuesta SO relacionada para eso. :) Realmente no aborda el enfoque de tipo especial, pero analiza la ganancia potencial de tener cadenas simplificadas.
haylem