Diferença entre UTF-8 e UTF-16? Por que precisamos disso?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
Respostas:
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:
Principais contras UTF-8:
Principais profissionais do UTF-16:
char
como o componente primitivo da string.Principais contras UTF-16:
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.
fonte
Eles são simplesmente esquemas diferentes para representar caracteres Unicode.
Ambos são de comprimento variável - o UTF-16 usa 2 bytes para todos os caracteres no plano multilíngue básico (BMP), que contém a maioria dos caracteres em uso comum.
O UTF-8 usa entre 1 e 3 bytes para caracteres no BMP, até 4 para caracteres no intervalo Unicode atual de U + 0000 a U + 1FFFFF e é extensível até U + 7FFFFFFF, se isso for necessário ... mas notavelmente todos os caracteres ASCII são representados em um único byte cada.
Para os propósitos de um resumo da mensagem, não importa qual deles você escolhe, desde que todos que tentam recriar o resumo usem a mesma opção.
Consulte esta página para obter mais informações sobre UTF-8 e Unicode.
(Observe que todos os caracteres Java são pontos de código UTF-16 no BMP; para representar caracteres acima de U + FFFF, é necessário usar pares substitutos em Java.)
fonte
Segurança: Use apenas UTF-8
Houve pelo menos algumas vulnerabilidades de segurança nas implementações do UTF-16 . Veja a Wikipedia para detalhes .
WHATWG e W3C têm agora declarou que só UTF-8 é para ser usado na Web.
Outros grupos estão dizendo o mesmo.
Portanto, embora o UTF-16 possa continuar sendo usado internamente por alguns sistemas como Java e Windows, o pouco uso do UTF-16 que você já viu no passado para arquivos de dados, troca de dados e outros provavelmente desaparecerá completamente.
fonte
Isso não está relacionado ao UTF-8/16 (em geral, embora ele converta em UTF16 e a parte BE / LE possa ser definida com uma única linha), mas abaixo é a maneira mais rápida de converter String em byte []. Por exemplo: bom exatamente para o caso fornecido (código hash). String.getBytes (enc) é relativamente lento.
fonte
A maneira simples de diferenciar UTF-8 e UTF-16 é identificar pontos em comum entre eles.
Além de compartilhar o mesmo número unicode para um determinado caractere, cada um tem seu próprio formato.
fonte