"Unicode" no Windows é UTF-16LE e cada caractere tem 2 ou 4 bytes. O Linux usa o UTF-8 e cada caractere tem entre 1 e 4 bytes.
Estou usando apenas o conjunto de 128 caracteres definido no padrão ANSI original.
Mas como um todo, como os arquivos são implementados de maneira diferente?
Não estou preocupado com a exibição, ou seja, se uma guia for exibida com 6 ou 8 caracteres, mas a representação interna real na memória
Uma diferença que ouvi é o uso de \ r \ n (Windows) vs. \ n para terminação de linha (Linux).
"Unicode" no Windows é UTF-16LE e cada caractere tem 2 ou 4 bytes. O Linux usa o UTF-8 e cada caractere tem entre 1 e 4 bytes.
O Windows usa finais de linha CRLF ( \r\n
, 0D 0A
), enquanto o Unix usa apenas LF ( \n
, 0A
).
A maioria dos sistemas modernos (ou seja, desde 2004) usam o UTF-8 como caractere padrão codificação.
O Windows, no entanto, não possui suporte nativo para o UTF-8. Ele funciona internamente em UTF-16 e assume que as sequências baseadas em char
estão em uma página de códigos legada . Felizmente, o Notepad é capaz de ler arquivos UTF-8; infelizmente, a codificação "ANSI" ainda é padrão.
O Windows (raramente) usa Ctrl + Z como um caractere de fim de arquivo. Por exemplo, se você type
um arquivo no prompt de comando, ele será truncado no primeiro 1A
byte.
No Unix, Ctrl + Z não é nada especial.
No Windows, os arquivos UTF-8 geralmente começam com uma "marca de ordem de bytes" EF BB BF
para diferenciá-los dos arquivos ANSI.
No Linux, a BOM é desencorajada porque quebra coisas como linhas shebang em scripts de shell. Além disso, seria inútil ter uma assinatura UTF-8 quando o UTF-8 é a codificação padrão.
One difference I've hear is the use of \r\n (Windows) vs. \n for line breaks (Linux).
Sim. A maioria dos editores de texto UNIX lidará com isso automaticamente, editores de programadores do Windows podem lidar com isso, editores de texto gerais (base Notepad) não.
O Windows parece também precisar do EOF (Ctrl-Z) como END OF FILE em alguns contextos, enquanto você provavelmente nunca o verá no UNIX.
Lembre-se de que o MacOS X agora é UNIX, portanto, ele usa finais de linha do UNIX. Embora antes do OS X (MacOS 9 e abaixo) ele tivesse seu próprio final (\ r)
EDIT: em outro formato CR e LF:
Qual codificação Unicode é usada não é baseada em sistema operacional.
Mesmo o Windows notepad.exe tem as opções listadas- (colocarei entre colchetes o que o bloco de notas significa com isso) ANSI (não unicode), Unicode (notepad significa Unicode LE), Unicode Big Endian (BE), UTF-8
ANSI não é unicode, envolve um número muito limitado de caracteres, então vamos deixar isso de lado.
Mas veja até o bloco de notas pode fazer LE, ou BE, ou UTF-8
Com o bloco de notas à parte, o UTF-8 pode estar com ou sem uma lista de materiais.
E eu uso o Windows com o Cygwin embora as portas do Windows possam \ r \ n mesmo quando você especificar \ n Já viu isso.
Não existe uma regra sobre qual codificação Unicode usa um determinado sistema operacional. Não seria um sistema operacional muito flexível se houvesse.
Para ver realmente as diferenças, conheça o Software, o que o Codificação de um software usa ou oferece.
Obtenha o Cygwin e o xxd e / ou um editor hexadecimal e veja o que realmente está dentro do arquivo. Use o comando 'file' para ajudar a identificar um arquivo. Então você realmente vê o que é UTF 16bit LE. Qual UTF 16bit BE é. O que é o UTF-8 (e o UTF-8 pode ser com ou sem uma lista de materiais).
Às vezes, você pode dizer ao bloco de notas para salvar como unicode (pelo qual o bloco de notas significa unicode 16 bit little endian), e não. Mas escolha uma fonte unicode como unicode arial, e copie em alguns caracteres unicode do charmap e ela irá. E uma boa maneira de ver o que o notepad ou o software está fazendo, é olhar o hex de um arquivo
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.
O comando dd (um comando * nix que eu executo do cygwin dentro do Windows) pode alterná-lo
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 o próprio bloco de notas pode ser UTF-16 Big Endian ou UTF-16 Little Endian ou UTF-8
Se você é uma pessoa técnica ou até mesmo apenas um usuário do bloco de notas, não está vinculado a uma codificação por causa do seu sistema operacional!
Suponho que o UTF-8 faça mais sentido do que o UTF-16, o UTF-16 usaria 16 bits, mesmo para caracteres que precisem apenas de 8 bits. Além disso, tenha em mente que o charmap mostra o código UTF-16.Sublime (um editor de texto do Windows) salva o unicode como UTF-8 por padrão.
Eu uso o Windows e às vezes unicode, e estou usando principalmente o UTF-8.
E como o Windows é tecnicamente flexível, o Linux é tecnicamente flexível!
O Linux usa o UTF-8 e cada caractere tem entre 1 e 6 bytes, não entre 1 e 4 bytes.
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