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

16

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

Hennes
fonte
Eu acho que a marca de ordem dos bytes está matando o meu #! (Primeira linha) nos meus arquivos php que transferi do windows para o linux. O arquivo inteiro funciona, mas não consegue encontrar o intérprete como deveria. Se eu specefically certifique-se de codificação em ANSI, selecionando o método de codificação no bloco de notas é verdade ASCII ou faz o Windows fazer outra coisa
Veja se você tem bomstrip na sua caixa de Gnu / Linux. Faz parte do Debian (e pelo menos alguns outros), mas pode precisar de instalação. É necessário porque a Microsoft adiciona erroneamente uma BOM ao início dos arquivos utf-8.
Ctrl-alt-delor 18/03/19

Respostas:

17

"Unicode" no Windows é UTF-16LE e cada caractere tem 2 ou 4 bytes. O Linux usa UTF-8 e cada caractere tem entre 1 e 4 bytes.

"O mínimo absoluto que todo desenvolvedor de software deve saber absolutamente, positivamente sobre Unicode e conjuntos de caracteres (sem desculpas!)"

Ignacio Vazquez-Abrams
fonte
O Windows desperdiça um byte?
1
Se você não estiver usando nada fora do Latin-1, sim.
Ignacio Vazquez-Abrams
Eles estão no artigo ao qual vinculei.
Ignacio Vazquez-Abrams
1
Fez uma pesquisa pelo UTF-16LE, mas não o encontrou no artigo.
1
Na maioria das vezes. Você também precisa contar a lista técnica, se presente.
Ignacio Vazquez-Abrams
11

Quebras de linha

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

Codificação de caracteres

Os sistemas Unix mais modernos (ou seja, desde 2004 mais ou menos) fazem do UTF-8 a codificação de caracteres padrão.

O Windows, no entanto, carece de suporte nativo para UTF-8. Ele trabalha internamente em UTF-16 e assume que as charcadeias baseadas em estão em uma página de códigos herdada . Felizmente, o Bloco de Notas é capaz de ler arquivos UTF-8; infelizmente, a codificação "ANSI" ainda é o padrão.

Caracteres Especiais Problemáticos

SUBSTITUTO U + 001A

O Windows (raramente) usa Ctrl+ Zcomo um caractere de fim de arquivo. Por exemplo, se você tiver typeum arquivo no prompt de comando, ele será truncado no primeiro 1Abyte.

No Unix, Ctrl+ Znão é nada de especial.

ZERO DE FEFF U + COM ESPAÇO SEM QUEBRA (Marca de Pedido de Byte)

No Windows, os arquivos UTF-8 geralmente começam com uma "marca de ordem de bytes" EF BB BFpara 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 UTF-8 for a codificação padrão de qualquer maneira.

user46971
fonte
1
O Ctrl-Z funciona no Windows, assim como o Ctrl-D (ou qualquer caractere com o qual você se vinculou ao EOF stty) no Linux: o driver do console o converte no final do arquivo. O caractere literal não aparece no fluxo de entrada; ele só faz com que ler () para retornar 0.
psusi
Eu acho que a marca de ordem dos bytes está matando o meu #! (Primeira linha) nos meus arquivos php que transferi do windows para o linux. O arquivo inteiro funciona, mas não consegue encontrar o intérprete como deveria. Se eu especifico codificar em ANSI, selecionando o método de codificação no bloco de notas, é verdadeiro ASCII ou o Windows faz outra coisa?
1
Vale ressaltar que o pseudo-termo “página de código ANSI”, embora ainda apareça em programas como o Bloco de Notas, é totalmente inadequado, e a Microsoft admitiu isso há muito tempo. Consulte en.wikipedia.org/wiki/Windows_code_page para obter detalhes.
Incnis MRSI
O utf-8 não possui uma lista técnica, mas o MS-Windows insere uma. Fazendo isso não é verdade utf-8. Uma das regras do utf-8 é que qualquer arquivo que possa ser representado em ascii seja um pouco idêntico no utf-8. Além disso, você pode começar a ler utf-8 em qualquer ponto do fluxo.
Ctrl-alt-delor 18/03/19
3

Uma diferença que ouvi é o uso de \ r \ n (Windows) vs. \ n para quebras de linha (Linux).

Sim. A maioria dos editores de texto do UNIX lida com isso automaticamente, os editores de programadores do Windows podem lidar com isso, os editores de texto gerais (bloco de notas básico) não.

O Windows também parece precisar do EOF (Ctrl-Z) como FIM DO ARQUIVO em alguns contextos, enquanto você provavelmente nunca o verá no UNIX.

Lembre-se de que o MacOS X agora é o UNIX abaixo e, portanto, usa as terminações da linha 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, avanço de linha (LF)
  • \ r é ASCII 0x0D, retorno de carro (CR)
Rich Homolka
fonte
Onde estão \ r \ n e \ n no conjunto de caracteres ASCII? pt.wikipedia.org/wiki/File:ASCII_Code_Chart.svg
2
@ Chris \ n é ASCII 0x0A, avanço de linha. \ 0x0D ASCII, retorno de carro
Rich Homolka 07/07
@ Rich E quanto ao EOF? Este é um caractere ANSI?
2
@barlop, o terminal converte o pressionamento de tecla (normalmente é ctrl-d em sistemas unix) em EOF, a menos que essa tecla de controle tenha sido desativada. O aplicativo lê um EOF em vez da chave real que você pressiona. Ou seja, read()retorna zero bytes em vez de qualquer caractere específico.
Psusi
1
@ Barlop, é o que venho dizendo: não retorna nenhum caractere. read () retorna o número de bytes que ele armazenou no seu buffer. No EOF, ele simplesmente fornece zero bytes. Esse é o sinal de que você chegou ao final do arquivo e que não há mais nada para ler.
psusi 9/12/2015
1

A codificação Unicode usada não é baseada no sistema operacional.

Até o notepad.exe do Windows tem opções listadas - (colocarei entre colchetes o que o bloco de notas significa com isso) ANSI (não unicode), Unicode (bloco de notas 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

E, além do bloco de notas, o UTF-8 pode ser com ou sem uma lista técnica.

E eu uso o Windows com Cygwin, embora as portas do Windows funcionem \ r \ n mesmo quando você especificar \ n Já viu sed fazer isso.

Não há uma regra sobre qual codificação Unicode usa um sistema operacional específico. Não seria um sistema operacional muito flexível se houvesse.

Para realmente ver as diferenças, conheça o Software, que codificação um pedaço de 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 'arquivo' para ajudar a identificar um arquivo. Então você realmente vê o que é UTF 16bit LE. O que é UTF 16bit BE. O que é UTF-8 (e UTF-8 pode ser com ou sem uma BOM).

Às vezes, você pode dizer ao bloco de notas para salvar como unicode (o que significa que o bloco de notas significa unicode endian pouco de 16 bits), e não será. Mas escolha uma fonte unicode como arial unicode e copie alguns caracteres unicode do charmap e assim será. E uma boa maneira de ver o que o bloco de notas ou qualquer outro software está fazendo é observando o hexadecimal 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 corro do cygwin no 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 salvar como UTF-16 Big Endian ou UTF-16 Little Endian ou UTF-8

insira a descrição da imagem aqui

Se você é um técnico ou apenas um usuário de bloco de notas, não está vinculado a uma codificação por causa do seu sistema operacional!

Suponho que UTF-8 faça mais sentido do que UTF-16, o UTF-16 usaria 16 bits, mesmo para caracteres que precisam apenas de 8 bits. Além disso, lembre-se de 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 UTF-8 principalmente.

E como o Windows é tecnicamente flexível, o linux é pelo menos tecnicamente flexível!

barlop
fonte
Você escreveu os comandos filee typedentro do prompt do Cygwin?
Vesnog
xxde typecomandos estão ausentes na instalação padrão do Cygwin, presumo. Além disso, quero reproduzir seus resultados.
Vesnog
1
O @Vesnog typeé um comando padrão embutido no cmd.exe, xxdprovavelmente não está instalado com o cygwin por padrão, mas quando você instala o cygwin ou depois dele, se você inicia a instalação do cygwin, obtém uma longa lista de comandos que podem ser instalados para usar no cygwin, e apenas digite xxd na caixa de pesquisa de configuração do cygwin e ele será exibido. O xxd também está disponível após a instalação do vim7, para que você possa obtê-lo também.
barlop
1
@Vesnog, você pode executar comandos do cygwin dentro ou fora do cygwin. Se você executá-los fora do cygwin, adicione c:\cygwin\bin(se é onde está o subdiretório bin do cygwin) no seu caminho. Além disso, qualquer comando cmd interno como 'type' ou 'dir' ou qualquer exe externo como calc.exe (calculadora do Windows) pode ser executado / iniciado a partir do cygwin. Praticamente tudo o que pode ser executado a partir do cygwin pode ser executado a partir do cmd e vice-versa. Se você quiser usar o bash, use o cygwin e se tiver problemas com aspas simples vs duplas, execute os comandos cygwin no cygwin e cmd no cmd.
barlop
1
O @Vesnog xxd também pode escrever um arquivo, por exemplo echo 61|xxd -r -p>a.a, tentar type a.a Então, você pode obter um byte dump com xxd -p, reorganizar ou modificar os bytes, depois alimentá-lo com xxd -r -p e obter um novo arquivo diferente com uma codificação ou dados diferentes com base nos dados antigos. O comando "arquivo" está descobrindo a codificação, com base nos bytes.
barlop
-1

O Linux usa 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
it_is_a_literature
fonte
Isso já foi afirmado na resposta apresentada em 2011.
Ramhound