Quais são as diferenças entre os arquivos .txt do Linux e do Windows (codificação Unicode)?

15

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).

    
por Hennes 07.06.2011 / 22:48

5 respostas

17

"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 Mínimo Absoluto que Todo Desenvolvedor de Software Absolutamente, Positivamente Deve Saber Sobre Unicode e Conjuntos de Caracteres (Sem desculpas!)"

    
por 07.06.2011 / 22:52
9

Quebras de linha

O Windows usa finais de linha CRLF ( \r\n , 0D 0A ), enquanto o Unix usa apenas LF ( \n , 0A ).

Codificação de caracteres

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.

Caracteres Especiais Problemáticos

U + 001A SUBSTITUTO

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.

U + FEFF ZERO COM NO-BREAK SPACE (marca de ordem de bytes)

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.

    
por 08.06.2011 / 02:01
3

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:

  • \ n é ASCII 0x0A, alimentação de linha (LF)
  • \ r é ASCII 0x0D, retorno de carro (CR)
por 07.06.2011 / 23:22
1

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!

    
por 16.10.2014 / 14:27
-1

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
    
por 03.08.2018 / 03:13