Resposta curta: restrições impostas no kernel Unix / Linux / BSD, namei()
function. A codificação ocorre em programas no nível do usuário, como xterm
, firefox
ou ls
.
Acho que você está começando de premissas incorretas. Um nome de arquivo no Unix é uma string de bytes com valores arbitrários. Alguns valores, 0x0 (ASCII Nul) e 0x2f (ASCII '/') simplesmente não são permitidos, não como parte de uma codificação de caracteres de múltiplos bytes, não como qualquer coisa. Um "byte" pode conter um número representando um caractere (em ASCII e algumas outras codificações), mas um "caractere" pode exigir mais de 1 byte (por exemplo, pontos de código acima 0x7f na representação UTF-8 do Unicode).
Essas restrições surgem das convenções de impressão de nomes de arquivos e do conjunto de caracteres ASCII. Os Unixes originais usavam bytes valorizados ASCII '/' (numericamente 0x2f) para separar partes de um caminho parcialmente ou totalmente qualificado (como '/ usr / bin / cat' tem partes "usr", "bin" e "cat") . Os Unixes originais usavam ASCII Nul para finalizar strings. Além desses dois valores, os bytes nos nomes dos arquivos podem assumir qualquer outro valor. Você pode ver um eco disso na codificação UTF-8 para Unicode. Caracteres ASCII imprimíveis, incluindo '/', levam apenas um byte em UTF-8. UTF-8 para pontos de código acima não inclui nenhum byte de valor zero, exceto para o caractere de controle Nul. O UTF-8 foi inventado para o Plan-9, o pretendente ao trono do Unix.
Unixes mais antigos (e parece Linux) tinham uma função namei()
que apenas analisa os caminhos um byte de cada vez e divide os caminhos em pedaços em bytes com valor 0x2F, parando em um byte de valor zero. namei()
faz parte do kernel Unix / Linux / BSD, então é onde os valores de byte excepcionais são impostos.
Observe que até agora, falei sobre valores de bytes, não caracteres. namei()
não impõe nenhuma semântica de caracteres nos bytes. Isso depende dos programas em nível de usuário, como ls
, que podem classificar nomes de arquivos com base em valores de bytes ou valores de caracteres. xterm
decide quais pixels acender para nomes de arquivos com base na codificação de caracteres. Se você não disser xterm
você tem nomes de arquivos codificados em UTF-8, você verá muitos detalhes quando invocá-los. Se vim
não for compilado para detectar codificações UTF-8 (ou qualquer outra coisa, UTF-16, UTF-32), você verá muitos detalhes quando abrir um "arquivo de texto" contendo caracteres codificados em UTF-8.