No Ubuntu 18.04, criei um arquivo de texto fictício com apenas um caractere UTF-8 è
,. Os outros caracteres são todos ascii
:
$ cat dummytext
Hello
Helloè
Este é o resultado hexdump
:
$ hexdump -C dummyfile
00000000 48 65 6c 6c 6f 0a 48 65 6c 6c 6f c3 a8 0a |Hello.Hello...|
0000000e
O arquivo é identificado como
$ file dummyfile
dummyfile2: UTF-8 Unicode text
Cada caractere é representado por um único byte, exceto o è
caractere UTF-8 , que é c3a8
, portanto, é representado por 2 bytes. Como o conteúdo do arquivo pode ser interpretado corretamente, se o número de bytes usados para representar cada caractere não for constante?
Meu palpite: talvez o analisador, ao encontrar um valor hexadecimal maior que o último ascii
caractere 7F
(e este é o caso de c3
), seja obrigado a ler pelo menos outro byte, para determinar o caractere correto a ser impresso?
file
saber que isso é UTF-8, quando poderia ser uma codificação antiga de 8 bits? seguido por Como um decodificador UTF-8 sabe onde as seqüências de bytes múltiplos começam e terminam? .file
como uma verificação adicional). A resposta de DopeGhoti se encaixa na segunda. Para o primeiro, talvezfile
procure bytes "cujo bit de ordem superior esteja definido" e, em seguida, seja capaz de adivinhar se há uma codificação UTF-8.Respostas:
No manual do BSD, seção 5, a página em UTF8 lê:
No manual do Linux, seção 7, a página no UTF8 lê da mesma forma:
Portanto, não é realmente possível distinguir ASCII de UTF-8 porque, em um arquivo UTF-8, ASCII é UTF-8.
file
examina os primeiros 96 KB de um arquivo e tenta determinar o que é. Como ele vê mais de zero seqüências de código UTF-8, determina que o arquivo seja UTF-8 porque é um superconjunto estrito de ASCII.fonte