Al lavoro sembra che nessuna settimana passi mai senza qualche connipazione, calamità o catastrofe legata alla codifica. Il problema di solito deriva dai programmatori che pensano di poter elaborare in modo affidabile un file di "testo" senza specificarne la codifica. Ma non puoi.
Quindi è stato deciso d'ora in poi vietare ai file di avere nomi che finiscono con *.txt
o *.text
. L'idea è che quelle estensioni inducano in errore il programmatore occasionale in un ottuso compiacimento riguardo alle codifiche, e questo porta a una gestione impropria. Sarebbe quasi meglio non avere alcuna estensione, perché almeno allora sai che non sai cosa hai.
Tuttavia, non andremo così lontano. Invece dovrai usare un nome di file che termina con la codifica. Così, per i file di testo, per esempio, questi sarebbero qualcosa come README.ascii
, README.latin1
, README.utf8
, etc.
Per i file che richiedono una particolare estensione, se si può specificare la codifica all'interno del file stesso, come in Perl o Python, allora lo farai. Per i file come l'origine Java in cui non esiste una tale funzionalità interna al file, inserirai la codifica prima dell'estensione, come SomeClass-utf8.java
.
Per l'output, UTF-8 deve essere fortemente preferito.
Ma per l'input, dobbiamo capire come gestire le migliaia di file nella nostra base di codice denominata *.txt
. Vogliamo rinominarli tutti per adattarli al nostro nuovo standard. Ma non possiamo assolutamente osservarli tutti. Quindi abbiamo bisogno di una libreria o di un programma che funzioni davvero.
Questi sono variamente in ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 o Apple MacRoman. Sebbene sappiamo di poter dire se qualcosa è ASCII, e abbiamo un buon cambiamento nel sapere se qualcosa è probabilmente UTF-8, siamo perplessi riguardo alle codifiche a 8 bit. Poiché siamo in esecuzione in un ambiente Unix misto (Solaris, Linux, Darwin) con la maggior parte dei desktop Mac, abbiamo alcuni file MacRoman fastidiosi. E soprattutto questi sono un problema.
Da qualche tempo sto cercando un modo per determinare a livello di codice quale di
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
è presente un file e non ho trovato un programma o una libreria in grado di distinguere in modo affidabile tra queste tre diverse codifiche a 8 bit. Probabilmente abbiamo più di mille file MacRoman da soli, quindi qualsiasi rilevatore di set di caratteri che utilizziamo deve essere in grado di rilevarli. Niente di ciò che ho visto può gestire il trucco. Avevo grandi speranze per la libreria del rilevatore di set di caratteri ICU , ma non può gestire MacRoman. Ho anche esaminato i moduli per fare lo stesso genere di cose sia in Perl che in Python, ma ancora e ancora è sempre la stessa storia: nessun supporto per il rilevamento di MacRoman.
Quello che sto quindi cercando è una libreria o un programma esistente che determini in modo affidabile in quale di queste cinque codifiche si trova un file, e preferibilmente di più. In particolare deve distinguere tra le tre codifiche a 3 bit che ho citato, specialmente MacRoman . I file contengono più del 99% di testo in lingua inglese; ce ne sono alcuni in altre lingue, ma non molti.
Se è codice di libreria, la nostra preferenza per la lingua è che sia in Perl, C, Java o Python e in quest'ordine. Se è solo un programma, allora non ci interessa davvero in quale linguaggio si trovi fintanto che viene fornito con il codice sorgente completo, gira su Unix ed è completamente libero.
Qualcun altro ha avuto questo problema di un miliardo di file di testo legacy codificati in modo casuale? In tal caso, come hai tentato di risolverlo e quanto hai avuto successo? Questo è l'aspetto più importante della mia domanda, ma mi interessa anche sapere se pensi che incoraggiare i programmatori a nominare (o rinominare) i loro file con la codifica effettiva in cui si trovano questi file ci aiuterà a evitare il problema in futuro. Qualcuno ha mai provato a far rispettare questo su una base istituzionale, e se sì, era che il successo o no, e perché?
E sì, capisco perfettamente perché non si possa garantire una risposta definitiva data la natura del problema. Questo è particolarmente il caso di file di piccole dimensioni, in cui non si dispone di dati sufficienti per continuare. Fortunatamente, i nostri file sono raramente piccoli. A parte il README
file casuale , la maggior parte ha dimensioni comprese tra 50k e 250k e molti sono più grandi. Qualunque cosa più di qualche K di dimensione è garantita in inglese.
Il dominio del problema è il text mining biomedico, quindi a volte ci occupiamo di corpora estesi ed estremamente grandi, come tutti i repository di accesso aperto di PubMedCentral. Un file piuttosto enorme è il BioThesaurus 6.0, a 5,7 gigabyte. Questo file è particolarmente fastidioso perché è quasi tutto UTF-8. Tuttavia, alcuni numbskull sono andati e hanno bloccato alcune righe in una codifica a 8 bit - Microsoft CP1252, credo. Ci vuole un bel po 'di tempo prima che tu inciampi su quello. :(