Il mio codice sorgente dovrebbe essere in UTF-8?


10

Sento che spesso non scegli davvero in quale formato è il tuo codice. Intendo che la maggior parte dei miei strumenti in passato ha deciso per me. O non ci ho nemmeno pensato. L'altro giorno stavo usando TextPad su Windows e mentre stavo salvando un file, mi ha chiesto ASCII, UTF-8/16, Unicode ecc ecc ...

Suppongo che quasi tutto il codice scritto sia ASCII, ma perché dovrebbe essere ASCII? Dovremmo effettivamente utilizzare i file UTF-8 ora per il codice sorgente e perché? Immagino che questo potrebbe essere utile per i team multilingue. Ci sono standard associati a come i team multilingue nominano variabili / funzioni / ecc?


6
Scrivo tutto il mio codice in Klingon, zolla insensibile!

5
@JackManey: Questo non è /. zolla insensibile!
FrustratedWithFormsDesigner,

E lo script Klingon non è in Unicode, quindi dovresti usare caratteri "uso privato" o una traslitterazione ASCII.
dan04,

@ dan04: Klingon ha un uso pseudo-standard della parte di uso privato del BMP (vedi registro ConScript ) :-)
Ross Patterson,

Vedi anche gli argomenti qui: utf8everywhere.org
Rory Hunter

Risposte:


23

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.


6

La maggior parte degli IDE verrà salvata per impostazione predefinita con la codifica UTF-8 e quasi sicuramente dovresti scegliere UTF-8 su ASCII quando ti viene data l'opzione. Questo assicurerà di non incontrare strani problemi con il codice di internazionalizzazione.


2
Stai facendo sembrare che ASCII vs. UTF-8 sia una scelta. Quando ci sono caratteri non ASCII in un file, non lo è. Quando ci sono solo caratteri ASCII, UTF-8 è ASCII.
Fred Foo,

Vorrei che Eclipse aderisse a questo. Come studente CS-ish del primo anno, il mio dio è stato questa la causa di molti mal di testa quando si lavora in gruppo, dove c'è una presenza di utenti di OS X, Windows e Linux. (Per riferimento, per impostazione predefinita è MacRoman su OS X, CP-1252 su Windows e ho dimenticato quale su Linux, ma scommetti che è diverso.)
Leflings

@leflings - probabilmente una codifica di ambiente predefinita che attualmente è solitamente UTF-8.
Maciej Piechotka,

1

Essere in grado di scrivere testo semplice in stringhe o caratteri tra virgolette nel codice sorgente e vedere il carattere reale è molto bello. Ad esempio il simbolo pi 'π' o l'ideografo '𠀊' sono molto più belli dell'equivalente '\ u3c0' per pi e L '\ u2000A' per l'ideografo.

È possibile digitare e / o copiare e incollare questi caratteri direttamente nel codice sorgente, proprio come faresti con i caratteri ASCII, in un editor decente.

Trovo esempi concreti utili nel concettualizzare e comprendere cose che a volte le descrizioni delle parole non sembrano guidare verso casa. Concettualizza le costanti di caratteri Unicode digitate nel codice sorgente, come il seguente breve esempio di frammento di codice:

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

Il carattere tilde ASCII '~' può essere salvato in un file sorgente ASCII o UTF-8, ma i caratteri Unicode non possono essere memorizzati in formato ASCII. Il simbolo PI 'π' è il punto di codice Unicode 0x3c0 e può essere memorizzato in forma UTF-8 come valore di due byte 0xcf, 0x80. Gli ideografi nei punti di codice Unicode 0x2000a e 0x2893d richiedono sequenze UTF-8 a 4 byte.

Affinché quei caratteri mantengano i valori previsti e il compilatore li interpreti come previsto, il codice sorgente deve essere salvato in un formato che supporti il ​​set di caratteri Unicode, come UTF-8 o UTF-16. Se salvato come UTF-8, un compilatore decente capirà e interpreterà i valori come previsto e un editor decente caricherà e visualizzerà i caratteri correttamente.

Come altri hanno sottolineato, se semplicemente non hai caratteri nel tuo codice sorgente al di fuori dell'intervallo ASCII, il salvataggio come UTF-8 comporterà un file che non è diverso dal salvataggio di un file ASCII, dal momento che UTF- 8 è progettato per sovrapporre ASCII nell'intervallo di caratteri ASCII. Non appena digiti un carattere nel codice sorgente che non rientra nell'intervallo ASCII, un editor decente ti informerà che devi scegliere una codifica da utilizzare per salvare il file. UTF-8 è una buona scelta poiché può gestire ASCII così com'è e praticamente ogni altro personaggio supportato nel tuo ambiente di sviluppo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.