A escolha não é entre ASCII e UTF-8. O ASCII é uma codificação de 7 bits e o UTF-8 a substitui - qualquer texto ASCII válido também é UTF-8 válido. Os problemas surgem quando você usa caracteres não ASCII; para isso, você deve escolher entre UTF-8, UTF-16, UTF-32 e várias codificações de 8 bits (ISO-xxxx, etc.).
A melhor solução é manter um conjunto de caracteres ASCII estrito, ou seja, apenas não use caracteres não ASCII no seu código. A maioria das linguagens de programação fornece maneiras de expressar caracteres não ASCII usando caracteres ASCII, por exemplo, "\u1234"
para indicar o ponto de código Unicode em 1234. Especialmente, evite usar caracteres não ASCII para identificadores. Mesmo que funcionem corretamente, as pessoas que usam um layout de teclado diferente vão amaldiçoá-lo por fazê-las digitar esses caracteres.
Se você não pode evitar caracteres não ASCII, UTF-8 é sua melhor aposta. Ao contrário de UTF-16 e UTF-32, é um superconjunto de ASCII, o que significa que qualquer pessoa que o abra com a codificação incorreta acertará pelo menos a maior parte; e, diferentemente das páginas de código de 8 bits, ele pode codificar todos os caracteres de que você precisará, sem ambiguidade, e está disponível em todos os sistemas, independentemente da localidade.
E então você tem a codificação que seu código processa; isso não precisa ser o mesmo que a codificação do seu arquivo de origem. Por exemplo, eu posso escrever PHP facilmente em UTF-8, mas defino sua codificação multibyte interna como, por exemplo, Latin-1; como o analisador PHP não se preocupa com codificações, mas apenas lê sequências de bytes, meus literais de string UTF-8 serão mal interpretados como Latin-1. Se eu enviar essas strings em um terminal UTF-8, você não verá diferenças, mas o comprimento das strings e outras operações multibyte (por exemplo substr
) produzirão resultados incorretos.
Minha regra geral é usar UTF-8 para tudo; somente se você absolutamente precisar lidar com outras codificações, converta para UTF-8 o mais cedo possível e a partir de UTF-8 o mais tarde possível.