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 es. "\u1234"
per indicare il punto di codice Unicode a 1234. Soprattutto, evitare di utilizzare caratteri non ASCII per identificatori. Anche se funzionano correttamente, chi usa un layout di tastiera diverso ti maledirà per averli fatti digitare questi caratteri.
Se non puoi evitare 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 la codifica sbagliata ottiene almeno la maggior parte di esso correttamente; e a differenza delle codepage a 8 bit, può codificare su ogni personaggio di cui avrai mai bisogno, senza ambiguità, 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, ad esempio, Latin-1; poiché il parser PHP non si occupa affatto delle codifiche, ma piuttosto legge sequenze di byte, i miei valori letterali di stringa UTF-8 verranno interpretati erroneamente come Latin-1. Se esco da queste stringhe su un terminale UTF-8, non vedrai alcuna differenza, ma le lunghezze delle stringhe e altre operazioni multibyte (ad esempio substr
) produrranno risultati errati.
La mia regola generale è 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.