No trabalho, parece que nenhuma semana passa sem algum conluio, calamidade ou catástrofe relacionada à codificação. O problema geralmente deriva de programadores que pensam que podem processar de forma confiável um arquivo de “texto” sem especificar a codificação. Mas você não pode.
Portanto, decidiu-se, doravante, proibir que os arquivos tenham nomes que terminem em *.txt
ou *.text
. O pensamento é que essas extensões enganam o programador casual em uma complacência maçante em relação às codificações, e isso leva a um manuseio impróprio. Seria quase melhor não ter extensão alguma, porque pelo menos você sabe que não sabe o que tem.
No entanto, não iremos tão longe. Em vez disso, espera-se que você use um nome de arquivo que termine na codificação. Assim, para arquivos de texto, por exemplo, estes seriam algo como README.ascii
, README.latin1
, README.utf8
, etc.
Para arquivos que exigem uma extensão particular, se alguém pode especificar a codificação dentro do próprio arquivo, como em Perl ou Python, então você deve fazer isso. Para arquivos como o código-fonte Java, em que não existe tal recurso interno ao arquivo, você colocará a codificação antes da extensão, como SomeClass-utf8.java
.
Para saída, UTF-8 deve ser fortemente preferido.
Mas, para entrada, precisamos descobrir como lidar com os milhares de arquivos em nossa base de código chamada *.txt
. Queremos renomear todos eles para se adequarem ao nosso novo padrão. Mas não podemos olhar para todos eles. Portanto, precisamos de uma biblioteca ou programa que realmente funcione.
Eles estão em ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 ou Apple MacRoman. Embora saibamos que podemos dizer se algo é ASCII, e temos uma boa mudança de saber se algo é provavelmente UTF-8, estamos perplexos quanto às codificações de 8 bits. Como estamos executando em um ambiente Unix misto (Solaris, Linux, Darwin) com a maioria dos desktops sendo Macs, temos alguns arquivos MacRoman irritantes. E isso é especialmente um problema.
Já faz algum tempo que procuro uma maneira de determinar programaticamente qual dos
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
um arquivo está em e eu não encontrei um programa ou biblioteca que possa distinguir com segurança entre as três codificações de 8 bits diferentes. Provavelmente temos mais de mil arquivos MacRoman sozinhos, então qualquer detector de charset que usamos deve ser capaz de farejá-los. Nada do que vi pode resolver o problema. Eu tinha grandes esperanças para a biblioteca do detector de conjuntos de caracteres ICU , mas ela não pode lidar com o MacRoman. Também examinei módulos para fazer o mesmo tipo de coisa em Perl e Python, mas sempre é a mesma história: sem suporte para detectar MacRoman.
O que estou procurando, portanto, é uma biblioteca ou programa existente que determine com segurança em qual dessas cinco codificações um arquivo está - e de preferência mais do que isso. Em particular, ele deve distinguir entre as três codificações de 3 bits que citei, especialmente a MacRoman . Os arquivos têm mais de 99% de texto no idioma inglês; existem alguns em outras línguas, mas não muitos.
Se for um código de biblioteca, nossa preferência de linguagem é em Perl, C, Java ou Python, e nessa ordem. Se for apenas um programa, não nos importamos em qual linguagem ele está, contanto que venha com o código-fonte completo, seja executado no Unix e seja totalmente livre.
Alguém mais teve esse problema de um zilhão de arquivos de texto legados codificados aleatoriamente? Se sim, como você tentou resolvê-lo e qual foi seu grau de sucesso? Este é o aspecto mais importante da minha pergunta, mas também estou interessado em saber se você acha que encorajar os programadores a nomear (ou renomear) seus arquivos com a codificação real em que esses arquivos estão nos ajudará a evitar o problema no futuro. Alguém já tentou impor isso em uma base institucional, e se sim, foi que bem sucedida ou não, e por quê?
E sim, compreendo perfeitamente por que não se pode garantir uma resposta definitiva dada a natureza do problema. Esse é especialmente o caso de arquivos pequenos, nos quais você não tem dados suficientes para continuar. Felizmente, nossos arquivos raramente são pequenos. Além do README
arquivo aleatório , a maioria está na faixa de tamanho de 50k a 250k, e muitos são maiores. Qualquer coisa maior do que alguns K de tamanho está garantido em inglês.
O domínio do problema é a mineração de texto biomédica, então às vezes lidamos com corpora extensos e extremamente grandes, como todo o repositório de acesso aberto do PubMedCentral. Um arquivo bastante grande é o BioThesaurus 6.0, com 5,7 gigabytes. Este arquivo é especialmente irritante porque é quase todo UTF-8. No entanto, alguns estúpidos foram e enfiaram algumas linhas nele que estão em alguma codificação de 8 bits - Microsoft CP1252, eu acredito. Demora um pouco antes de você tropeçar naquele. :(