Qual é a vantagem de escolher a codificação ASCII sobre UTF-8?

91

Todos os caracteres em ASCII podem ser codificados usando UTF-8 sem um aumento no armazenamento (ambos requerem um byte de armazenamento).

O UTF-8 possui o benefício adicional do suporte a caracteres além de "caracteres ASCII". Se for esse o caso, por que é que vamos sempre escolher a codificação ASCII sobre UTF-8?

Existe um caso de uso em que escolheremos ASCII em vez de UTF-8?

Pacerier
fonte
9
Para apoiar o material legado ...
fretje
9
i significar a UTF8 é legacily apoio ASCII também. portanto, mesmo que você precise dar suporte a coisas herdadas, o UTF8 funcionaria perfeitamente, sem outras alterações necessárias.
Pacerier 30/07
3
Talvez você precise interoperar com um sistema que inclua 8 caracteres ASCII em 7 bytes? As pessoas faziam coisas malucas para encaixar as coisas.
Donal Fellows
4
Me chame de louco, mas eu diria segurança e estabilidade. Um conjunto de caracteres sem sequências de vários bytes é muito mais difícil de quebrar. Não me interpretem mal, quando o suporte à linguagem humana é importante, o ASCII não o ajudará. Mas se você está apenas fazendo alguma programação básica e pode se espremer na linguagem nativa para a qual o compilador e o sistema operacional foram escritos, por que adicionar essa complexidade? @Donal Fellows. Última vez que verifiquei ... ASCII é de 7 bytes. (qualquer coisa com um pouco mais apenas não é ASCII e está pedindo para ter problemas)
ebyrob
2
@ebyrob Eu acho que Donal Fellows significa bit empacotando 8 símbolos ASCII em 7 bytes, já que cada símbolo está usando 7 bits cada ... 8 * 7 = 56 bits = 7 bytes. Isso significaria um codificar especial e função de descodificação, apenas para guardar um byte de armazenamento fora de cada 8.
dodgy_coder

Respostas:

83

Em alguns casos, pode acelerar o acesso a caracteres individuais. Imagine uma string str='ABC'codificada em UTF8 e ASCII (e supondo que o idioma / compilador / banco de dados saiba sobre codificação)

Para acessar o terceiro Ccaractere ( ) dessa string usando o operador de acesso à matriz, que é destaque em muitas linguagens de programação, você faria algo assim c = str[2].

Agora, se a string for codificada em ASCII, tudo o que precisamos fazer é buscar o terceiro byte da string.

Se, no entanto, a string for codificada em UTF-8, primeiro devemos verificar se o primeiro caractere é um caractere de um ou dois bytes, precisamos executar a mesma verificação no segundo caractere e somente assim podemos acessar o terceiro caractere. A diferença no desempenho será maior, quanto maior a corda.

Esse é um problema, por exemplo, em alguns mecanismos de banco de dados, onde, para encontrar o início de uma coluna colocada 'após' um VARCHAR codificado em UTF-8, o banco de dados não precisa apenas verificar quantos caracteres existem no campo VARCHAR, mas também como muitos bytes que cada um deles usa.

Mchl
fonte
3
Se o banco não armazena tanto a "contagem de caracteres" e a "contagem de bytes", então eu diria que ele tem alguns problemas ...
Dean Harding
1
TBH eu não conheço nenhum banco de dados que iria armazenar também ... #
1100
@Mchl: como você imagina que o banco de dados sabe quando atingiu o final da string?
kevin Cline
1
Geralmente, atingindo 0x00 ou 0x0000
Mchl 27/02/2013
4
@DeanHarding Como a contagem de caracteres informa onde o segundo caractere começa? Ou o banco de dados também deve conter um índice para cada deslocamento de caractere? Nota: Não são apenas 2 caracteres, mas podem ter até 4 (a menos que sejam 6) stackoverflow.com/questions/9533258/… . (Eu acho que é apenas a UTF-16 que tinha os realmente longos abominações que poderiam destruir o sistema)
ebyrob
7

Se você usar apenas o subconjunto US-ASCII (ou ISO 646) do UTF-8, não haverá uma vantagem real para um ou outro; de fato, tudo é codificado de forma idêntica.

Se você vai além do conjunto de caracteres US-ASCII e usa (por exemplo) caracteres com acentos, trematos etc., usados ​​em idiomas típicos da Europa Ocidental, então há uma diferença - a maioria deles ainda pode ser codificado com um único byte na ISO 8859, mas exigirá dois ou mais bytes quando codificado em UTF-8. Há também, é claro, desvantagens: a ISO 8859 exige que você use alguns meios fora da banda para especificar a codificação que está sendo usada e suporta apenas uma.desses idiomas por vez. Por exemplo, você pode codificar todos os caracteres do alfabeto cirílico (russo, bielorrusso, etc.) usando apenas um byte cada, mas se precisar / desejar misturar esses caracteres com caracteres franceses ou espanhóis (além dos US-ASCII / ISO 646) você está sem sorte - precisa alterar completamente os conjuntos de caracteres para fazer isso.

A ISO 8859 é realmente útil apenas para alfabetos europeus. Para dar suporte à maioria dos alfabetos usados ​​na maioria dos alfabetos chinês, japonês, coreano, árabe, etc., você precisa usar uma codificação completamente diferente. Alguns deles (por exemplo, Shift JIS para japonês) são uma dor absoluta para lidar. Se houver alguma chance de você querer apoiá-los, considero que vale a pena usar o Unicode apenas por precaução.

Jerry Coffin
fonte
5

ANSI pode ser muitas coisas, a maioria sendo conjuntos de caracteres de 8 bits nesse sentido (como a página de código 1252 no Windows).

Talvez você estivesse pensando em ASCII, que é de 7 bits e um subconjunto adequado de UTF-8. Ou seja, qualquer fluxo ASCII válido também é um fluxo UTF-8 válido.

Se você estivesse pensando em conjuntos de caracteres de 8 bits, uma vantagem muito importante seria que todos os caracteres representáveis ​​sejam exatamente de 8 bits, onde no UTF-8 eles podem ter até 24 bits.


fonte
Sim, eu estou falando sobre o conjunto ASCII de 7 bits. você consegue pensar em 1 vantagem que precisaremos salvar como ascii em vez de utf-8? (já que o 7-bit iria ser salvos como 8-bit de qualquer maneira, o tamanho do arquivo seria exatamente o mesmo)
Pacerier
1
Se você tiver caracteres maiores que o valor unicode 127, eles não poderão ser salvos no ASCII.
1
@ Pacerier: Qualquer string ASCII é uma string UTF-8 , portanto não há diferença . A rotina de codificação pode ser mais rápida, dependendo da representação em cadeia da plataforma que você usa, embora eu não esperasse uma aceleração significativa, enquanto você tem uma perda significativa na flexibilidade.
Jul2
@Thor que é exatamente por isso que eu estou perguntando se salvar como ASCII tem qualquer vantagem em tudo
Pacerier
5
@Pacerier, se você salvar XML como ASCII, precisará usar, por exemplo, o & # 160; para um espaço inquebrável. Isso é mais satisfatório, mas torna seus dados mais resistentes a erros de codificação ISO-Latin-1 vs UTF-8. É isso que fazemos, pois nossa plataforma subjacente faz muita mágica invisível com os personagens. Permanecer no ASCII torna nossos dados mais robustos.
3

Sim, ainda existem alguns casos de uso em que o ASCII faz sentido: formatos de arquivo e protocolos de rede . Em particular, para usos em que:

  • Você tem dados gerados e consumidos por programas de computador, nunca apresentados aos usuários finais;
  • Mas o que é útil para os programadores poderem ler, para facilitar o desenvolvimento e a depuração.

Ao usar o ASCII como sua codificação, você evita a complexidade da codificação de bytes múltiplos, mantendo ao menos alguma legibilidade humana.

Alguns exemplos:

  • O HTTP é um protocolo de rede definido em termos de sequências de octetos, mas é muito útil (pelo menos para programadores que falam inglês) que correspondam à codificação ASCII de palavras como "GET", "POST", "Accept-Language" e em breve.
  • Os tipos de partes no formato de imagem PNG consistem em quatro octetos, mas é útil se você estiver programando um codificador ou decodificador PNG que IDATsignifica "dados da imagem" e PLTEsignifica "paleta".

É claro que você precisa ter cuidado para que os dados realmente não sejam apresentados aos usuários finais, porque se eles ficarem visíveis (como aconteceu no caso dos URLs), os usuários esperam, com razão, que esses dados sejam em um idioma que eles possam ler.

Gareth Rees
fonte
Bem dito. É um pouco irônico que o HTTP, o protocolo que transmite o maior número de unicode do planeta, precise apenas suportar ASCII. (Na verdade, acho que o mesmo vale para TCP e IP, suporte de binário, suporte ASCII ... isso é tudo que você precisa naquele nível de pilha)
ebyrob
2

Primeiro de tudo: seu título usa / d ANSI, enquanto no texto você se refere a ASCII. Observe que ANSI não é igual a ASCII. ANSI incorpora o conjunto ASCII. Mas o conjunto ASCII é limitado aos primeiros 128 valores numéricos (0 - 127).

Se todos os seus dados estiverem restritos a ASCII (7 bits), não importa se você usa UTF-8, ANSI ou ASCII, pois ambos ANSI e UTF-8 incorporam o conjunto ASCII completo. Em outras palavras: os valores numéricos de 0 até 127, inclusive, representam exatamente os mesmos caracteres em ASCII, ANSI e UTF-8.

Se você precisar de caracteres fora do conjunto ASCII, precisará escolher uma codificação. Você pode usar o ANSI, mas depois enfrenta os problemas de todas as diferentes páginas de código. Criar um arquivo na máquina A e lê-lo na máquina B pode / produzirá textos engraçados se essas máquinas estiverem configuradas para usar páginas de códigos diferentes, simples porque o valor numérico nnn representa caracteres diferentes nessas páginas de código.

Esse "inferno de página de código" é a razão pela qual o padrão Unicode foi definido. UTF-8 é apenas uma codificação única desse padrão; existem muito mais. O UTF-16 é o mais amplamente utilizado, pois é a codificação nativa do Windows.

Portanto, se você precisar suportar algo além dos 128 caracteres do conjunto ASCII, meu conselho é usar o UTF-8 . Dessa forma, não importa e você não precisa se preocupar com qual página de código seus usuários configuraram seus sistemas.

Marjan Venema
fonte
se eu não precisar oferecer suporte além de 128 caracteres, qual é a vantagem de escolher a codificação ACSII sobre a codificação UTF8?
Pacerier 30/07
Além de se limitar a esses 128 caracteres? Não muito. O UTF-8 foi projetado especificamente para atender o ASCII e a maioria dos idiomas ocidentais que "apenas" precisam de ANSI. Você verá que o UTF-8 codificará apenas um número relativamente pequeno dos caracteres ANSI mais altos com mais de um byte. Há uma razão para a maioria das páginas HTML usar UTF-8 como um padrão ...
Marjan Venema
1
@Pacerier, se você não precisa de codificação acima de 127, a escolha de ASCII pode valer a pena quando você usa alguma API para codificar / decodificar, porque o UTF precisa de verificação de bits adicional para considerar bytes adicionais como o mesmo caractere, pode exigir computação adicional em vez de ASCII puro, que acabou de ler 8 bits sem verificação. Mas eu só recomendo que você use ASCII se realmente precisar de um alto nível de otimização em computação grande (grande) e você souber o que está fazendo nessa otimização. Caso contrário, basta usar UTF-8.
Luciano