Perché Windows 7 funziona con Unicode e non con UTF-8?
Terminologia
Unicode e UTF-8 non sono lo stesso tipo di cosa: Unicode è un personaggio-set che definisce un insieme di caratteri (un repertorio) e dei numeri cessionari (punti di codice) per ciascuno di questi personaggi. UTF ‑ 8 è una delle numerose codifiche che possono essere utilizzate per rappresentare un flusso di caratteri Unicode su disco o in trasmissione. Lo stesso flusso di caratteri Unicode potrebbe anche essere codificato come UTF ‑ 16, UTF ‑ 32 o UTF ‑ 7, ad esempio.
Tuttavia, Avvisi voi "codifica" opzioni tra cui ANSI
, Unicode
, Unicode big-endian
e UTF-8
. Gli sviluppatori Microsoft che hanno scritto questo hanno usato termini sbagliati. Quando dicono "Unicode", molto probabilmente significano " UTF-16
little-endian ". Quando dicono "ANSI" intendono il codice pagina 1252 (CP-1252).
Blocco note di Microsoft
Credo che il Blocco note di Microsoft scriva UTF-16 con un segno di ordine dei byte ( BOM ) e che Blocco note cerchi la DBA durante la lettura di un file di testo. La DBA indica all'app che il file è UTF-16 e indica se è big-endian o little-endian.
Se Blocco note non trova la distinta componenti, chiama una funzione di libreria IsTextUnicode
, che esamina i dati e tenta di indovinare quale codifica è stata utilizzata. A volte (inevitabilmente) indovina in modo errato. A volte indovina che un file "ANSI" è "Unicode". Tentare di interpretare un file UTF-16 o UTF-8 come Pagina di codice 1252 provocherebbe la visualizzazione di glifi errati e l'impossibilità di trovare glifi per il rendering di alcuni valori a 8 bit, che verrebbero quindi visualizzati come quadrati.
Come afferma harrymc nella sua risposta , ci sono alternative migliori a Blocco note. Ma Blocco note ti consente di scegliere esplicitamente la codifica quando apri un file (anziché lasciare Blocco note per provare a indovinare).
Contrassegni di ordine di byte
Secondo il consorzio Unicode, i Byte Order Marks (BOMs) sono opzionali. Tuttavia, Windows si affida alle distinte base per distinguere tra alcune codifiche.
Quindi in breve, forse i tuoi file non avevano una DBA per qualche motivo? Forse la DBA è andata persa durante il processo di aggiornamento?
Se hai ancora i file originali che vengono visualizzati come quadrati, puoi crearne uno esadecimale per vedere se contengono una DBA.
Standard per file di testo semplice
Il problema è che in realtà non ce ne sono - nessuno standard universale per i file di testo semplice. Invece abbiamo un numero di incompatibilità e incognite.
Come sono stati segnati i finali di linea? Alcune piattaforme usano i caratteri di controllo Carriage Return (CR) seguiti da Line Feed (LF), alcuni usano CR da soli e altri usano LF da soli.
I suddetti terminatori o separatori? Ciò ha un effetto alla fine di un file ed è noto per causare problemi.
Trattamento di schede e altri caratteri di controllo. Potremmo supporre che una scheda venga utilizzata per allinearla a un multiplo di 8 larghezze di caratteri standard dall'inizio della riga, ma in realtà non esiste alcuna certezza. Molti programmi consentono di modificare le posizioni delle schede.
Set di caratteri e codifica? Non esiste uno standard universale per indicare quali di questi sono stati utilizzati per il testo nel file. Il più vicino che abbiamo è cercare la presenza di una DBA che indica che la codifica è una di quelle usate per Unicode. Dal valore BOM il programma che legge il file può distinguere tra UTF-8 e UTF-16, ecc. E tra le varianti Little-Endian e Big-Endian di UTF-16, ecc. Non esiste uno standard universale per indicare che un file è codificato in qualsiasi altra codifica popolare come CP-1252 o KOI-8.
E così via. Nessuno dei metadati sopra è scritto nel file di testo, pertanto l'utente finale deve informare il programma durante la lettura del file. L'utente finale deve conoscere i valori dei metadati per qualsiasi file specifico o correre il rischio che il loro programma utilizzi valori di metadati errati.
Bush ha nascosto i fatti
Prova questo su Windows XP.
- Apri Blocco note.
- Impostare il carattere su Arial Unicode MS. (Potrebbe essere necessario installarlo prima; se non lo vedi nel menu, fai clic su "Mostra più caratteri".)
- Inserisci il testo "Bush ha nascosto i fatti".
- Scegli
Save As
. Dal Encoding
menu, selezionare ANSI
.
- Chiudi Blocco note.
- Riaprire il documento (ad esempio, utilizzando
Start
, My Recent Documents
).
- Vedrai 畂 桳 栠 摩 琠 敨 映 捡 獴 invece di "Bush ha nascosto i fatti".
Ciò dimostra che la IsTextUnicode
funzione utilizzata da Blocco note indovina erroneamente che il testo ANSI (in realtà Pagina di codice 1252) è Unicode UTF-16LE senza una distinta base. Non vi è alcuna DBA in un file salvato come ANSI
.
Windows 7
Con Windows 7, Microsoft si è adattato in IsTextUnicode
modo tale che ciò non accada. In assenza di una DBA, è ora più probabile che indovini ANSI (CP 1252) che Unicode (UTF-16LE). Con Windows 7 mi aspetto quindi che sia più probabile che tu abbia il problema inverso: un file contenente caratteri Unicode con punti di codice maggiori di 255, ma senza BOM, ora ha maggiori probabilità di essere indovinato come ANSI - e quindi visualizzato in modo errato.
Prevenire i problemi di codifica
Attualmente, l'approccio migliore sembra essere quello di utilizzare UTF-8 ovunque. Idealmente, ricodificheresti tutti i vecchi file di testo in UTF-8 e salveresti sempre e solo i file di testo come UTF-8. Ci sono strumenti come recode e iconv che possono aiutarti in questo.