En el trabajo, parece que no pasa una semana sin alguna connipción, calamidad o catástrofe relacionada con la codificación. El problema suele derivar de los programadores que piensan que pueden procesar de forma fiable un archivo de "texto" sin especificar la codificación. Pero no puedes.
Por lo tanto, se decidió prohibir a partir de ahora que los archivos tengan nombres que terminen en *.txt
o *.text
. La idea es que esas extensiones inducen a error al programador casual a una aburrida complacencia con respecto a las codificaciones, y esto conduce a un manejo inadecuado. Casi sería mejor no tener ninguna extensión, porque al menos entonces sabes que no sabes lo que tienes.
Sin embargo, no vamos a llegar tan lejos. En su lugar, se esperará que utilice un nombre de archivo que termine en la codificación. Así que para archivos de texto, por ejemplo, estos serían algo así como README.ascii
, README.latin1
, README.utf8
, etc.
Para los archivos que exigen una extensión en particular, si se puede especificar la codificación dentro del archivo en sí, como en Perl o Python, entonces debe hacerlo. Para archivos como la fuente de Java donde no existe tal facilidad interna al archivo, colocará la codificación antes de la extensión, como SomeClass-utf8.java
.
Para la salida, se prefiere mucho UTF-8 .
Pero para la entrada, tenemos que averiguar cómo tratar con los miles de archivos en nuestra base de código denominada *.txt
. Queremos cambiar el nombre de todos ellos para que se ajusten a nuestro nuevo estándar. Pero no podemos mirarlos a todos. Entonces necesitamos una biblioteca o programa que realmente funcione.
Estos están en ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 o Apple MacRoman. Aunque sabemos que podemos decir si algo es ASCII, y tenemos un buen cambio de saber si algo es probablemente UTF-8, estamos perplejos acerca de las codificaciones de 8 bits. Debido a que estamos funcionando en un entorno Unix mixto (Solaris, Linux, Darwin) y la mayoría de los equipos de escritorio son Mac, tenemos bastantes archivos MacRoman molestos. Y estos especialmente son un problema.
Desde hace algún tiempo, he estado buscando una forma de determinar mediante programación cuál de
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
hay un archivo y no he encontrado un programa o biblioteca que pueda distinguir de manera confiable entre esas tres codificaciones diferentes de 8 bits. Probablemente solo tengamos más de mil archivos MacRoman, por lo que cualquier detector de juego de caracteres que usemos debe ser capaz de detectarlos. Nada de lo que he visto puede manejar el truco. Tenía grandes esperanzas para la biblioteca de detectores de juegos de caracteres ICU , pero no puede manejar MacRoman. También miré módulos para hacer el mismo tipo de cosas tanto en Perl como en Python, pero una y otra vez siempre es la misma historia: no hay soporte para detectar MacRoman.
Por lo tanto, lo que estoy buscando es una biblioteca o programa existente que determine de manera confiable en cuál de esas cinco codificaciones se encuentra un archivo, y preferiblemente más que eso. En particular, tiene que distinguir entre las tres codificaciones de 3 bits que he citado, especialmente MacRoman . Los archivos tienen más del 99% de texto en inglés; hay algunos en otros idiomas, pero no muchos.
Si se trata de código de biblioteca, nuestra preferencia de idioma es que esté en Perl, C, Java o Python, y en ese orden. Si es solo un programa, entonces realmente no nos importa en qué idioma esté siempre que venga en código fuente completo, se ejecute en Unix y no tenga ningún tipo de carga.
¿Alguien más ha tenido este problema de un trillón de archivos de texto heredados codificados aleatoriamente? Si es así, ¿cómo intentó resolverlo y qué éxito tuvo? Este es el aspecto más importante de mi pregunta, pero también me interesa si cree que animar a los programadores a nombrar (o cambiar el nombre) a sus archivos con la codificación real en la que se encuentran nos ayudará a evitar el problema en el futuro. Alguien ha tratado de hacer cumplir esta sobre una base institucional, y si es así, fue que el éxito o no, y por qué?
Y sí, comprendo perfectamente por qué no se puede garantizar una respuesta definitiva dada la naturaleza del problema. Este es especialmente el caso de archivos pequeños, en los que no tiene suficientes datos para continuar. Afortunadamente, nuestros archivos rara vez son pequeños. Aparte del README
archivo aleatorio , la mayoría están en el rango de tamaño de 50k a 250k, y muchos son más grandes. Se garantiza que todo lo que tenga un tamaño superior a unos pocos K estará en inglés.
El dominio del problema es la minería de textos biomédicos, por lo que a veces tratamos con corpora extensos y extremadamente grandes, como todos los repositorios de acceso abierto de PubMedCentral. Un archivo bastante grande es el BioThesaurus 6.0, de 5,7 gigabytes. Este archivo es especialmente molesto porque casi todo es UTF-8. Sin embargo, algunos tontos fueron y pegaron algunas líneas que están en una codificación de 8 bits — Microsoft CP1252, creo. Toma bastante tiempo antes de que te tropieces con eso. :(