Acredito que existem muitos bons artigos sobre isso na Web, mas aqui está um breve resumo.
UTF-8 e UTF-16 são codificações de comprimento variável. No entanto, em UTF-8, um caractere pode ocupar um mínimo de 8 bits, enquanto em UTF-16 o comprimento de caractere começa com 16 bits.
Principais profissionais do UTF-8:
- Caracteres ASCII básicos, como dígitos, caracteres latinos sem acentos, etc. ocupam um byte idêntico à representação US-ASCII. Dessa forma, todas as seqüências US-ASCII se tornam UTF-8 válidas, o que fornece compatibilidade retroativa decente em muitos casos.
- Sem bytes nulos, que permitem usar cadeias terminadas em nulo, isso também introduz uma grande compatibilidade com versões anteriores.
- O UTF-8 é independente da ordem dos bytes, portanto você não precisa se preocupar com o problema do Big Endian / Little Endian.
Principais contras UTF-8:
- Muitos caracteres comuns têm comprimento diferente, o que diminui a indexação por ponto de código e calcula terrivelmente a contagem de pontos de código.
- Mesmo que a ordem dos bytes não importe, algumas vezes o UTF-8 ainda possui BOM (marca de ordem dos bytes), que serve para notificar que o texto está codificado em UTF-8 e também quebra a compatibilidade com o software ASCII, mesmo que o texto contenha apenas caracteres ASCII . O software da Microsoft (como o Bloco de notas) gosta especialmente de adicionar BOM ao UTF-8.
Principais profissionais do UTF-16:
- Caracteres BMP (plano multilíngüe básico), incluindo latim, cirílico, a maioria dos chineses (a RPC fez o suporte a alguns pontos de código fora do BMP obrigatório), a maioria dos japoneses pode ser representada com 2 bytes. Isso acelera a indexação e o cálculo da contagem de pontos de código, caso o texto não contenha caracteres adicionais.
- Mesmo se o texto tiver caracteres suplementares, eles ainda serão representados por pares de valores de 16 bits, o que significa que o comprimento total ainda é divisível por dois e permite usar 16 bits
char
como o componente primitivo da string.
Principais contras UTF-16:
- Muitos bytes nulos em cadeias US-ASCII, o que significa que não há cadeias terminadas em nulo e muita memória desperdiçada.
- Usá-lo como uma codificação de comprimento fixo “funciona principalmente” em muitos cenários comuns (especialmente nos EUA / UE / países com alfabetos cirílicos / Israel / países árabes / Irã e muitos outros), geralmente levando a um suporte quebrado onde não funciona. Isso significa que os programadores devem estar cientes dos pares substitutos e manipulá-los adequadamente nos casos em que isso importa!
- Seu comprimento é variável, portanto, contar ou indexar pontos de código é caro, embora menor que UTF-8.
Em geral, o UTF-16 geralmente é melhor para a representação na memória porque o BE / LE é irrelevante lá (basta usar a ordem nativa) e a indexação é mais rápida (apenas não se esqueça de lidar adequadamente com pares substitutos). O UTF-8, por outro lado, é extremamente bom para arquivos de texto e protocolos de rede, porque não há problema de BE / LE e a terminação nula geralmente é útil, além de compatibilidade com ASCII.