"Unicode" su Windows è UTF-16LE e ogni carattere è di 2 o 4 byte. Linux utilizza UTF-8 e ogni carattere è compreso tra 1 e 4 byte.
"Il minimo assoluto che ogni sviluppatore di software deve conoscere assolutamente e positivamente su Unicode e set di caratteri (niente scuse!)"
Interruzioni di riga
Windows utilizza CRLF (\r\n
, 0D 0A
) mentre Unix usa solo LF (\n
, 0A
).
Codifica caratteri
La maggior parte dei sistemi simili a Unix moderni (ovvero dal 2004 circa) fanno di UTF-8 la codifica dei caratteri predefinita.
Windows, tuttavia, non dispone del supporto nativo per UTF-8. Funziona internamente in UTF-16 e presuppone che char
le stringhe basate su si trovano in una tabella codici legacy. Fortunatamente, Blocco note è in grado di leggere file UTF-8; sfortunatamente, la codifica "ANSI" è ancora l'impostazione predefinita.
Caratteri speciali problematici
U+001A SOSTITUTO
Windows (raramente) usa Ctrl +Z come carattere di fine file. Ad esempio, se type
un file al prompt dei comandi, verrà troncato al primo 1A
byte.
Su Unix, Ctrl +Z non è niente di speciale.
U+FEFF ZERO CON SPAZIO SENZA INTERRUZIONE (Byte-Order Mark)
Su Windows, i file UTF-8 spesso iniziano con un "byte order mark" EF BB BF
per distinguerli dai file ANSI.
Su Linux, il BOM è sconsigliato 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.
Una differenza che ho sentito è l'uso di \r\n (Windows) rispetto a \n per le interruzioni di riga (Linux).
Sì. La maggior parte degli editor di testo UNIX lo gestirà automaticamente, gli editor di programmatori Windows potrebbero gestirlo, gli editor di testo generici (Blocco note di base) no.
Windows sembra aver bisogno anche dell'EOF (Ctrl-Z) come END OF FILE in alcuni contesti, mentre probabilmente non lo vedrai mai su UNIX.
Ricorda che MacOS X ora è UNIX sotto, quindi utilizza terminazioni di riga UNIX. Anche se prima di OS X (MacOS 9 e precedenti) aveva il proprio finale (\r)
EDIT:in altro formato CR e LF:
- \n è ASCII 0x0A, Line Feed (LF)
- \r è ASCII 0x0D, ritorno a capo (CR)