Por que o Java usa UTF-16 para representação interna de cadeias?

29

Eu imagino que o motivo foi rápido, como o acesso ao caractere no índice, mas alguns caracteres não se encaixam em 16 bits, por isso não funcionaria ...

Portanto, se você precisa lidar com casos especiais, por que não usar UTF-8?

mrpyo
fonte
4
Algo a perguntar aos designers de Java, não à comunidade em geral. Votar para fechar como não construtivo.
Oded
16
@Oded: absolutamente injustificado, como mostra a resposta do DeadMG.
Michael Borgwardt
Estou confuso: Eu estava bastante certo de que esta questão já foi respondida (tanto aqui como no SO), mas não consigo encontrar o duplicado (s).
Joachim Sauer #
Para passas histéricas. Veja utf8everywhere.org
Pavel Radzivilovsky

Respostas:

47

Porque costumava ser o UCS-2 , que era um bom tamanho fixo de 16 bits. Obviamente, 16 bits acabou por não ser suficiente. Eles adaptaram o UTF-16 na parte superior.

DeadMG
fonte
6
Aqui está uma citação da FAQ do 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.Na época do lançamento do Java, o UTF-16 ainda não apareceu e o UTF-8 não fazia parte do padrão Unicode.
Malcolm
20
UCS-2 é um termo técnico, não um chavão.
9788 DeadMG #
14

Para a parte principal, em prol de uma prova de futuro clara e simples. Se foi uma razão equivocada e o caminho errado a seguir, é uma questão diferente.

Você pode ver alguns motivos por trás de algumas de suas decisões de design neste documento sobre a mudança de 2004 para Java 5 e UTF-16, que também explica algumas das deficiências: Caracteres complementares na plataforma Java e consulte Por que o ecossistema Java usa codificações diferentes em toda a pilha? .

Para obter mais detalhes sobre as armadilhas do uso do UTF-16 e por que o UTF-8 é provavelmente uma opção melhor em geral, consulte UTF-16 deve ser considerado prejudicial? e o manifesto UTF-8 Everywhere .

haylem
fonte
8
+1 para vincular ao "O UTF-16 deve ser considerado prejudicial?" questão. Descobri recentemente o manifesto UTF-8 Everywhere e acredito que agora estou bastante convencido. Pelo que vale, embora Java tenha entendido errado, estou bastante convencido de que o Windows fez muito pior.
Daniel Pryden
5
Bem, não é uma surpresa que o Windows tenha entendido mais errado : eles mudaram para o Unicode mais cedo, portanto, tinham menos opções corretas e menos experiência. Java ficou mais tarde, acertou mais , mas ainda está um pouco errado. Agora, ambos precisam conviver com APIs antigas e incorretas, no sentido geral, que precisam continuar suportando.
Joachim Sauer
4
Essa é a vida no mundo do software, você precisa fazer escolhas sem ter todos os dados e, quando está errado, passa a viver com as consequências por um longo tempo. :-)
Brian Knoblauch
2
Eu me pergunto quais seriam as implicações de desempenho em criar stringum tipo "especial" em Java (como Arrayé o caso), em vez de Stringser uma classe "comum" que contém uma referência a uma matriz "comum" contendo os caracteres reais. Dependendo de como uma sequência é gerada, UTF-8, UTF-16 ou mesmo UTF-32 pode ser a maneira mais eficiente de armazená-la. Eu não acho que exista uma maneira particularmente eficiente para uma classe "comum" Stringlidar com vários formatos, mas um tipo "especial" com suporte à JVM poderia.
Supercat
@ supercat: Eu não tenho exatamente uma resposta precisa para isso, mas tenho uma resposta SO relacionada para isso. :) Realmente não aborda a abordagem de tipo especial, mas discute o ganho potencial de ter sequências simplificadas.
27514 haylem