J'imagine que la raison était rapide, comme l'accès au caractère à l'index, mais certains caractères ne tiennent pas en 16 bits, donc cela ne fonctionnerait pas ...
Donc, si vous devez gérer des cas spéciaux de toute façon, pourquoi ne pas simplement utiliser UTF-8?
Réponses:
Parce que c'était UCS-2 , qui était un joli 16 bits de longueur fixe. Bien sûr, 16 bits ne s'est pas avéré suffisant. Ils ont modernisé UTF-16 en haut.
la source
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.
Au moment de la sortie de Java, UTF-16 n'était pas encore apparu et UTF-8 ne faisait pas partie de la norme Unicode.Pour l'essentiel, dans un souci de pérennité clair et simple. Que ce soit une raison erronée et la mauvaise façon de procéder est une question différente.
Vous pouvez voir quelques raisons derrière certaines de leurs décisions de conception dans ce document sur le passage de 2004 à Java 5 et UTF-16, qui explique également certaines des lacunes: Caractères supplémentaires dans la plate-forme Java , et voir Pourquoi l'écosystème Java utilise-t-il différents encodages tout au long de leur pile? .
Pour plus de détails sur les pièges de l'utilisation de l'UTF-16, et pourquoi UTF-8 est susceptible d'être une meilleure option en général, voir UTF-16 devrait-il être considéré comme dangereux? et le manifeste UTF-8 Everywhere .
la source
string
un type "spécial" en Java (tout comme l'Array
est), plutôt que d'avoirString
une classe "ordinaire" contenant une référence à un tableau "ordinaire" contenant les caractères réels. Selon la façon dont une chaîne est générée, UTF-8, UTF-16 ou même UTF-32 peut être le moyen le plus efficace de la stocker. Je ne pense pas qu'il existe un moyen particulièrement efficace pour une classe "ordinaire"String
de gérer plusieurs formats, mais un type "spécial" avec prise en charge JVM le pourrait.