Como faço para distinguir entre arquivos 'binários' e 'texto'?

Informalmente, a maioria de nós entende que existem arquivos 'binários' (arquivos de objetos, imagens, filmes, executáveis, formatos de documentos proprietários, etc) e arquivos de 'texto' (código-fonte, arquivos XML, arquivos HTML, email, etc.).

Em geral, você precisa conhecer o conteúdo de um arquivo para poder fazer algo útil com ele e formar esse ponto de vista, se a codificação for 'binária' ou 'texto', isso realmente não importa. E, é claro, os arquivos armazenam apenas bytes de dados para que sejam todos 'binários' e 'texto' não significa nada sem conhecer a codificação. Ainda assim, ainda é útil falar sobre arquivos 'binários' e 'texto', mas para evitar ofender alguém com essa definição imprecisa, continuarei usando aspas 'assustadoras'.

No entanto, existem várias ferramentas que funcionam em uma ampla variedade de arquivos e, em termos práticos, você deseja fazer algo diferente com base no fato de o arquivo ser 'texto' ou 'binário'. Um exemplo disso é qualquer ferramenta que gera dados no console. O "texto" simples ficará bem e é útil. dados 'binários' atrapalham seu terminal e geralmente não são úteis de se olhar. O GNU grep usa pelo menos essa distinção ao determinar se deve produzir correspondências no consol

Então, a questão é: como saber se um arquivo é 'texto' ou 'binário'? E restringir ainda mais, como você diz em um Linux como o sistema de arquivos? Como não conheço nenhum metadado do sistema de arquivos que indique o 'tipo' de um arquivo, a pergunta se torna ainda mais, ao inspecionar o conteúdo de um arquivo, como saber se é 'texto' ou 'binário'? E, por simplicidade, vamos restringir 'texto' a caracteres que podem ser impressos no console do usuário. E, em particular, como vocêimplement isto? (Eu pensei que isso estivesse implícito neste site, mas acho que é útil, em geral, apontar para o código existente que faz isso, eu deveria ter especificado). Não estou realmente buscando o que programas existentes posso usar isto

questionAnswers(11)

yourAnswerToTheQuestion