Octals 302 240 juntos parecem corresponder ao espaço não quebra

4

Ao olhar para uma linha específica de um arquivo de texto (digamos, o 1123º, veja abaixo), parece que há um espaço sem quebra, mas não tenho certeza:

$ cat myfile.csv | sed -n 1123p | cut -f2
Lisztes feher

$ cat myfile.csv | sed -n 1123p | cut -f2 | od -An -c -b
   L   i   s   z   t   e   s 302 240   f   e   h   e   r  \n
 114 151 163 172 164 145 163 302 240 146 145 150 145 162 012

No entanto, o código ASCII em octal indica que um espaço não separável é 240. Então, a que corresponde o 302? É algo específico para este arquivo fornecido?

Estou fazendo a pergunta para entender. Eu já sei como usar o sed para corrigir meu problema, seguindo esta resposta :

$ cat myfile.csv | sed -n 1123p | cut -f2 | sed 's/\xC2\xA0/ /g' | od -An -c -b
   L   i   s   z   t   e   s       f   e   h   e   r  \n
 114 151 163 172 164 145 163 040 146 145 150 145 162 012

Para informações, o arquivo original está no formato .xlsx ( Excel ). Como o meu computador roda o Xubuntu , abri-o com LibreOffice Calc (v5.1). Em seguida, salvei-o como "CSV de texto" com "Conjunto de caracteres = Unicode (UTF-8)" e a guia como separador de campo:

$ file myfile.csv
myfile.csv: UTF-8 Unicode text
    
por tflutre 25.03.2016 / 18:19

1 resposta

14

É a codificação UTF-8 do caractere Unicode U + 00A0:

$ unicode U+00A0
U+00A0 NO-BREAK SPACE
UTF-8: c2 a0 UTF-16BE: 00a0 Decimal:   Octal: 40
 
Category: Zs (Separator, Space)
Bidi: CS (Common Number Separator)
Decomposition: <noBreak> 0020

$ locale charmap
UTF-8
$ printf '\ua0' | od -to1
0000000 302 240
0000002

O UTF-8 é uma codificação do Unicode com um número variável de bytes por caractere. Unicode como charset é um superconjunto do iso8859-1 (também conhecido como latin1), um superconjunto do ASCII.

Enquanto em iso8859-1, o caractere de espaço sem quebra (codepoint 0xa0 in iso8859-1 like in Unicode) seria expresso como um byte de 0xa0, em UTF-8, apenas os pontos de código de 0 a 127 são expressos como um byte (o que torna o UTF-8 um superconjunto do ASCII ou, em outras palavras, os arquivos ASCII também são arquivos UTF-8).

Pontos de código acima de 128 são codificados com mais bytes por caracteres. Veja Wikipedia para detalhes do algoritmo de codificação UTF-8.

    
por 25.03.2016 / 18:28