Le choix n'est pas entre ASCII et UTF-8. ASCII est un codage 7 bits, et UTF-8 le remplace - tout texte ASCII valide est également UTF-8 valide. Les problèmes surviennent lorsque vous utilisez des caractères non ASCII; pour ceux-ci, vous devez choisir entre UTF-8, UTF-16, UTF-32 et divers codages 8 bits (ISO-xxxx, etc.).
La meilleure solution est de s'en tenir à un jeu de caractères ASCII strict, c'est-à-dire de ne pas utiliser de caractères non ASCII dans votre code. La plupart des langages de programmation permettent d'exprimer des caractères non ASCII en utilisant des caractères ASCII, par exemple "\u1234"
pour indiquer le point de code Unicode à 1234. Surtout, évitez d'utiliser des caractères non ASCII pour les identificateurs. Même s'ils fonctionnent correctement, les personnes qui utilisent une disposition de clavier différente vont vous maudire de leur avoir fait taper ces caractères.
Si vous ne pouvez pas éviter les caractères non ASCII, UTF-8 est votre meilleur pari. Contrairement à UTF-16 et UTF-32, il s'agit d'un sur-ensemble d'ASCII, ce qui signifie que quiconque l'ouvre avec le mauvais encodage obtient au moins la plupart du temps; et contrairement aux pages de codes 8 bits, il peut encoder tous les caractères dont vous aurez besoin, sans ambiguïté, et il est disponible sur tous les systèmes, indépendamment des paramètres régionaux.
Et puis vous avez l'encodage que votre code traite; cela ne doit pas nécessairement être le même que l'encodage de votre fichier source. Par exemple, je peux facilement écrire PHP en UTF-8, mais définir son codage interne multi-octets sur, disons, Latin-1; parce que l'analyseur PHP ne se soucie pas du tout des encodages, mais lit simplement les séquences d'octets, mes littéraux de chaîne UTF-8 seront mal interprétés comme Latin-1. Si je génère ces chaînes sur un terminal UTF-8, vous ne verrez aucune différence, mais les longueurs de chaîne et d'autres opérations multi-octets (par exemple substr
) produiront des résultats erronés.
Ma règle d'or consiste à utiliser UTF-8 pour tout; uniquement si vous devez absolument gérer d'autres encodages, convertissez-les en UTF-8 le plus tôt possible et en UTF-8 le plus tard possible.