Quali sono le differenze tra i file .txt Linux e Windows (codifica Unicode)


16

Sto solo usando il set di 128 caratteri definito nello standard ANSI originale.

Ma nel complesso come vengono impiantati i file in modo diverso.

Non mi occupo del display, cioè se viene visualizzata una scheda con 6 o 8 caratteri ma l'attuale rappresentazione interna in memoria

Una differenza che ho sentito è l'uso di \ r \ n (Windows) vs. \ n per la terminazione di linea (Linux).


Penso che il segno dell'ordine dei byte stia uccidendo il mio #! (Prima riga) nei miei file php che ho trasferito da Windows a Linux. L'intero file funziona ma non riesce a trovare l'interprete come dovrebbe. Se mi assicuro esplicitamente di codificare in ANSI selezionando il metodo di codifica nel blocco note è vero ASCII o Windows fa qualcos'altro

Vedi se hai bomstrip sulla tua scatola Gnu / Linux. Fa parte di Debian (e almeno di alcuni altri), ma potrebbe essere necessario installarlo. È necessario perché Microsoft aggiunge erroneamente una DBA all'inizio dei file utf-8.
ctrl-alt-delor

Risposte:


17

"Unicode" su Windows è UTF-16LE e ogni carattere è 2 o 4 byte. Linux usa UTF-8 e ogni carattere ha tra 1 e 4 byte.

"Il minimo assoluto che ogni sviluppatore di software deve assolutamente conoscere positivamente su Unicode e set di caratteri (senza scuse!)"


Windows spreca un byte?

1
Se non stai usando nulla al di fuori di Latin-1, sì.
Ignacio Vazquez-Abrams,

Sono nell'articolo che ho collegato.
Ignacio Vazquez-Abrams,

1
Ho eseguito una ricerca per UTF-16LE ma non l'ho trovata nell'articolo.

1
Soprattutto. È inoltre necessario contare la DBA, se presente.
Ignacio Vazquez-Abrams,

11

Interruzioni di riga

Windows utilizza i finali di riga CRLF ( \r\n, 0D 0A) mentre Unix utilizza solo LF ( \n, 0A).

Codifica dei caratteri

La maggior parte dei moderni sistemi Unix (cioè dal 2004 o giù di lì) rendono UTF-8 la codifica dei caratteri predefinita.

Windows, tuttavia, manca del supporto nativo per UTF-8. Funziona internamente in UTF-16 e presuppone che le charstringhe basate su si trovano in una code page legacy . Fortunatamente, Blocco note è in grado di leggere file UTF-8; sfortunatamente, la codifica "ANSI" è ancora l'impostazione predefinita.

Personaggi speciali problematici

U + 001A SOSTITUTIVO

Windows (raramente) usa Ctrl+ Zcome carattere di fine file. Ad esempio, se si è typeun file al prompt dei comandi, verrà troncato al primo 1Abyte.

Su Unix, Ctrl+ Znon è niente di speciale.

U + FEFF ZERO CON SPAZIO NO-BREAK (segno di byte-order)

Su Windows, i file UTF-8 spesso iniziano con un "segno di ordine byte" EF BB BFper distinguerli dai file ANSI.

Su Linux, la distinta componenti è scoraggiata perché interrompe cose come le righe shebang negli script di shell. Inoltre, sarebbe inutile avere una firma UTF-8 quando UTF-8 è comunque la codifica predefinita.


1
Ctrl-Z funziona su Windows proprio come Ctrl-D (o qualsiasi altro carattere che hai associato a EOF stty) su Linux: il driver della console lo traduce alla fine del file. Il carattere letterale non appare nel flusso di input; causa solo read () per restituire 0.
psusi

Penso che il segno dell'ordine dei byte stia uccidendo il mio #! (Prima riga) nei miei file php che ho trasferito da Windows a Linux. L'intero file funziona ma non riesce a trovare l'interprete come dovrebbe. Se mi assicuro esplicitamente di codificare in ANSI selezionando il metodo di codifica nel blocco note è vero ASCII o Windows fa qualcos'altro?

1
Vale la pena ricordare che lo pseudo-termine "code page ANSI", sebbene sia ancora presente in programmi come Blocco note, è assolutamente un termine improprio, e Microsoft lo ha ammesso molto tempo fa. Vedi en.wikipedia.org/wiki/Windows_code_page per i dettagli.
Incnis Mrsi,

utf-8 non ha una DBA, ma MS-Windows ne inserisce una. Rendendolo non vero utf-8. Una delle regole di utf-8 è che qualsiasi file che potrebbe essere rappresentato in ascii, è bit per bit identico in utf-8. Inoltre puoi iniziare a leggere utf-8 in qualsiasi punto dello stream.
ctrl-alt-delor

3

Una differenza che ho sentito è l'uso di \ r \ n (Windows) vs. \ n per le interruzioni di riga (Linux).

Sì. La maggior parte degli editor di testo UNIX lo gestirà automaticamente, gli editor di programmatori di Windows potrebbero gestirlo, gli editor di testo generali (Blocco note di base) no.

Windows sembra anche aver bisogno dell'EOF (Ctrl-Z) come FINE DEL FILE in alcuni contesti, mentre probabilmente non lo vedrai mai su UNIX.

Ricorda che MacOS X è ora UNIX sotto, quindi utilizza i finali di linea UNIX. Sebbene prima di OS X (MacOS 9 e precedenti) avesse una sua fine (\ r)

EDIT: in altri formati CR e LF:

  • \ n è ASCII 0x0A, avanzamento riga (LF)
  • è ASCII 0x0D, ritorno a capo (CR)

Dove sono \ r \ n e \ n nel set di caratteri ASCII? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg

2
@Chris \ n è ASCII 0x0A, avanzamento riga. è ASCII 0x0D, ritorno a capo
Rich Homolka il

@Rich Che ne dici di EOF? È un personaggio ANSI?

2
@barlop, il terminale traduce la sequenza di tasti (normalmente è ctrl-d su sistemi unix) in EOF, a meno che questo tasto di controllo non sia stato disabilitato. L'applicazione legge un EOF anziché la chiave effettiva che si preme. Vale a dire, read()restituisce zero byte anziché qualsiasi carattere specifico.
psusi,

1
@barlop, è quello che ho detto: non restituisce alcun personaggio. read () restituisce il numero di byte che ha archiviato nel buffer. Su EOF, ti dà semplicemente zero byte. Questo è il segnale che hai raggiunto la fine del file e che non c'è altro da leggere.
psusi,

1

La codifica Unicode utilizzata non è basata sul sistema operativo.

Anche Windows Notepad.exe ha le opzioni elencate ((metterò tra parentesi ciò che significa Notepad) ANSI (non Unicode), Unicode (Notepad significa Unicode LE), Unicode Big Endian (BE), UTF-8

ANSI non è unicode ma comporta un numero molto limitato di caratteri, quindi lasciamo perdere.

Ma vedi anche il blocco note può fare LE, o BE o UTF-8

E a parte il blocco note, UTF-8 può essere con o senza una distinta base.

E io uso Windows con Cygwin anche se le porte di Windows potrebbero benissimo fare anche quando si specifica \ n Ho visto sed farlo.

Non esiste una regola per la codifica Unicode utilizzata da un determinato sistema operativo. Non sarebbe un sistema operativo molto flessibile se ci fosse.

Per vedere davvero le differenze, conosci il Software, cosa utilizza o offre la codifica di un software.

Ottieni Cygwin e xxd, e / o un editor esadecimale e guarda cosa c'è davvero nel file. Utilizzare il comando 'file' per aiutare a identificare un file. Quindi vedi effettivamente cos'è UTF 16bit LE. Che cos'è UTF 16bit BE. Che cos'è UTF-8 (e UTF-8 può essere con o senza una DBA).

A volte puoi dire al blocco note di salvare come unicode (con il quale blocco note significa unicode little endian a 16 bit), e non lo farà. Ma scegli un carattere unicode come arial unicode e copia alcuni caratteri unicode da charmap e lo farà. E un buon modo per vedere cosa sta facendo il blocco note o qualunque software, è guardare l'esagono di un file

C:\asdf>notepad.exe a.a

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>type a.a
aaa慡ൡ <-- though displayed aaa followed by some boxes in my cmd window
C:\asdf>

C:\asdf>xxd a.a
0000000: fffe 6100 6100 6100 6161 610d            ..a.a.a.aaa.

C:\asdf>

^^ The portion of the byte that stores the 61 is the lower value portion which with LE is stored first.

Il comando dd (un comando * nix che eseguo da Cygwin all'interno di Windows) può cambiarlo

C:\asdf>xxd -p a.a
fffe6100610061006161610d

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>dd if=a.a conv=swab of=a.a2
0+1 records in
0+1 records out
12 bytes (12 B) copied, 0 seconds, Infinity B/s

C:\asdf>type a.a2
a  a a aaa
C:\asdf>xxd -p a.a2
feff00610061006161610d61

C:\asdf>file a.a2
a.a2; Big-endian UTF-16 Unicode text, with no line terminators

C:\asdf>

E il blocco note stesso può essere salvato come UTF-16 Big Endian o UTF-16 Little Endian o UTF-8

inserisci qui la descrizione dell'immagine

Se sei un tecnico o anche solo un utente di blocco note, non sei vincolato a una codifica a causa del tuo sistema operativo!

Suppongo che UTF-8 abbia più senso di UTF-16, UTF-16 userebbe 16 bit anche per caratteri che dovrebbero avere bisogno solo di 8 bit. Inoltre, tieni presente che charmap mostra il codice UTF-16.

Sublime (un editor di testo di Windows) salva unicode come UTF-8 per impostazione predefinita.

Uso Windows e talvolta Unicode, e sto usando principalmente UTF-8.

E poiché Windows è tecnicamente flessibile, Linux è almeno altrettanto tecnicamente flessibile!


Hai scritto i comandi filee typeall'interno del prompt di Cygwin?
Vesnog,

xxde typepresumo mancano i comandi nell'installazione standard di Cygwin. A parte questo, voglio riprodurre i tuoi risultati.
Vesnog,

1
@Vesnog typeè un comando standard incorporato in cmd.exe che xxdmolto probabilmente non è installato con cygwin per impostazione predefinita, ma quando si installa cygwin o successivamente, se si avvia l'installazione di cygwin si ottiene un lungo elenco di comandi che è possibile installare per l'uso in cygwin, e basta digitare xxd nella casella di ricerca dell'installazione di cygwin e viene visualizzato. xxd è disponibile anche dopo l'installazione di vim7 in modo da poterlo ottenere anche da lì.
barlop

1
@Vesnog è possibile eseguire comandi cygwin all'interno di cygwin o al di fuori di cygwin. Se li esegui all'esterno di Cygwin, aggiungi c:\cygwin\bin(se è qui la sottodirectory bin di Cygwin), nel tuo percorso. Inoltre, qualsiasi comando cmd interno come 'type' o 'dir', o qualsiasi exe esterno come calc.exe (calcolatrice di Windows) può essere eseguito / avviato da cygwin. Praticamente tutto ciò che può essere eseguito da Cygwin può essere eseguito da cmd e viceversa. Se si desidera utilizzare bash, utilizzare cygwin e se si sono verificati problemi con virgolette singole o doppie, eseguire i comandi cygwin all'interno di cygwin e cmd all'interno di cmd.
barlop

1
@Vesnog xxd può anche scrivere un file, ad es. echo 61|xxd -r -p>a.aQuindi provare type a.a Quindi puoi effettivamente ottenere un dump di byte con xxd -p, riorganizzare o modificare i byte quindi inserirlo in xxd -r -p e ottenere un nuovo file diverso con una codifica diversa o dati diversi basati sui vecchi dati. Il comando "file" sta determinando la codifica, in base ai byte.
barlop

-1

Linux utilizza UTF-8 e ogni carattere è compreso tra 1 e 6 byte, non tra 1 e 4 byte.

U00000000 - U0000007F: 0xxxxxxx
U00000080 - U000007FF: 110xxxxx 10xxxxxx
U00000800 - U0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U00010000 - U001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U00200000 - U03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U04000000 - U7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Lo ha già affermato in una risposta presentata nel 2011.
Ramhound,
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.