La scelta non è tra ASCII e UTF-8. ASCII è una codifica a 7 bit e UTF-8 lo sostituisce: qualsiasi testo ASCII valido è anche UTF-8 valido. I problemi sorgono quando si utilizzano caratteri non ASCII; per questi devi scegliere tra UTF-8, UTF-16, UTF-32 e varie codifiche a 8 bit (ISO-xxxx, ecc.).
La soluzione migliore è attenersi a un set di caratteri ASCII rigoroso, ovvero non utilizzare caratteri non ASCII nel codice. La maggior parte dei linguaggi di programmazione fornisce modi per esprimere caratteri non ASCII usando caratteri ASCII, ad esempio "\u1234"
per indicare il punto di codice Unicode a 1234. Soprattutto, evitare di usare caratteri non ASCII per identificatori. Anche se funzionano correttamente, le persone che usano un layout di tastiera diverso ti malediranno per averli fatti scrivere questi caratteri.
Se non riesci ad evitare i caratteri non ASCII, UTF-8 è la soluzione migliore. A differenza di UTF-16 e UTF-32, è un superset di ASCII, il che significa che chiunque lo apra con una codifica errata ne ottiene almeno la maggior parte; e a differenza delle codepage a 8 bit, può codificare su ogni personaggio di cui avrai mai bisogno, in modo inequivocabile, ed è disponibile su tutti i sistemi, indipendentemente dalle impostazioni locali.
E poi hai la codifica che il tuo codice elabora; questo non deve essere lo stesso della codifica del tuo file sorgente. Ad esempio, posso facilmente scrivere PHP in UTF-8, ma impostare la sua codifica multibyte interna su, diciamo, Latin-1; poiché il parser PHP non si occupa affatto delle codifiche, ma legge semplicemente le sequenze di byte, i miei letterali stringa UTF-8 verranno interpretati erroneamente come Latin-1. Se invio queste stringhe su un terminale UTF-8, non vedrai alcuna differenza, ma la lunghezza delle stringhe e altre operazioni multibyte (ad es. substr
) Produrranno risultati errati.
La mia regola empirica è usare UTF-8 per tutto; solo se hai assolutamente a che fare con altre codifiche, converti in UTF-8 il prima possibile e da UTF-8 il più tardi possibile.