Windows 7 UTF-8 e Unicode


14

Qualcuno potrebbe spiegare cosa è cambiato in Windows 7 (Pro 64-bit)?

Dettagli: In precedenza avevo Windows XP e alcuni file di traduzione (codificati UTF-8) in formato CSV. Sono stato in grado di visualizzare i caratteri sia in Blocco note che in Excel. Dopo aver eseguito l'aggiornamento a Windows 7, quando apro questi file - tutto ciò che vedo sono caselle quadrate (solo che sai se li apro nel browser) sono stato in grado di vedere tutta la traduzione). Se salvo quei file in Unicode, tutto sembra andare bene.

Quindi, cosa sta succedendo esattamente? Perché Windows 7 funziona con Unicode e non con UTF-8?

Risposte:


30

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-endiane 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 Encodingmenu, 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 IsTextUnicodefunzione 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 IsTextUnicodemodo 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.


3
Secondo Wikipedia : in Windows Vista e Windows 7 [..] IsTextUnicode è stato modificato per rendere molto più probabile indovinare una codifica basata su byte anziché UTF-16LE.
Arjan,

Sì, sicuramente quei file hanno BOM poiché generiamo quei file con BOM. È interessante notare che Windows 7 non legge la distinta componenti creata dal sistema operativo precedente.
Sha Le

La distinta componenti non è cambiata. È possibile che i tuoi file non presentino la distinta componenti, ma che in precedenza il formato predefinito fosse una variante Unicode, dove ora è ASCII. Vedi la mia risposta
harrymc,

@Sha Le: se il file ha una DBA, il Blocco note di Windows 7 dovrebbe aprirlo correttamente, quindi il problema descritto non si adatta ai problemi noti isTextUnicode. Puoi creare un piccolo file di esempio che illustra il problema che hai con un file che include una DBA?
RedGrittyBrick il

C'è anche this app can breakper lo stesso effetto diBush hid the facts
Regent

3

Un'osservazione: è possibile utilizzare Notepad ++ per visualizzare questi file, utilizzando il menu Codifica.

Una volta che i file sono visualizzati correttamente, salvandoli si aggiungerà la DBA corretta.


So che questo post è un po 'vecchio, ma al momento ho problemi con win 7 e notepad ++ che non visualizzano UTF 8 senza BOM quando i file sono stati inizialmente creati usando notepad ++ v5.9.6.2 stesso.
Jake,

@Jake: assicurarsi che nel menu Codifica sia visualizzato "Codifica in UTF8", anziché "Codifica in UTF8 senza distinta componenti".
harrymc,

1

In Windows 10 è possibile (test su build 1903)

  1. Copia il tuo file con una buona codifica TXTUTF-8.txtin C:\WINDOWS\SHELLNEW.
  2. Nel HKEY_CLASSES_ROOT\.txt\ShellNewfare una nuova catena con il nome " FileName"
  3. Modifica il valore di " FileName" in " TXTUTF-8.txt"

Ora quando crei un nuovo file txt usando il menu di Windows, prenderai il tuo TXTUTF-8.txtcome modello

Fonte: https://answers.microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3-43e8-a154- d10c1fe94317

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.