Au travail, il semble qu'aucune semaine ne passe sans une conniption, une calamité ou une catastrophe liées à l'encodage. Le problème vient généralement des programmeurs qui pensent pouvoir traiter de manière fiable un fichier «texte» sans spécifier l'encodage. Mais tu ne peux pas.
Il a donc été décidé d'interdire désormais aux fichiers d'avoir des noms qui se terminent par *.txt
ou *.text
. L'idée est que ces extensions induisent en erreur le programmeur occasionnel dans une complaisance sourde concernant les encodages, ce qui conduit à une mauvaise manipulation. Il serait presque préférable de ne pas avoir d'extension du tout, car au moins, vous savez que vous ne savez pas ce que vous avez.
Cependant, nous ne sommes pas prêts à aller aussi loin. À la place, vous devrez utiliser un nom de fichier qui se termine par le codage. Donc , pour les fichiers texte, par exemple, ce serait quelque chose comme README.ascii
, README.latin1
, README.utf8
, etc.
Pour les fichiers qui nécessitent une extension particulière, si l'on peut spécifier le codage à l'intérieur du fichier lui-même, comme en Perl ou Python, alors vous devez le faire. Pour les fichiers comme Java source où aucune fonctionnalité de ce type n'existe à l'intérieur du fichier, vous placerez l'encodage avant l'extension, par exemple SomeClass-utf8.java
.
Pour la sortie, UTF-8 doit être fortement préféré.
Mais pour entrer, nous devons comprendre comment gérer les milliers de fichiers nommés dans notre base de code *.txt
. Nous voulons tous les renommer pour qu'ils correspondent à notre nouvelle norme. Mais nous ne pouvons pas tous les observer. Nous avons donc besoin d'une bibliothèque ou d'un programme qui fonctionne réellement.
Ceux-ci sont différents en ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 ou Apple MacRoman. Bien que nous sachions que nous pouvons dire si quelque chose est ASCII, et que nous sommes un bon changement de savoir si quelque chose est probablement UTF-8, nous sommes perplexes au sujet des encodages 8 bits. Parce que nous fonctionnons dans un environnement Unix mixte (Solaris, Linux, Darwin) avec la plupart des bureaux étant des Mac, nous avons pas mal de fichiers MacRoman ennuyeux. Et ceux-ci sont particulièrement problématiques.
Depuis un certain temps, je cherche un moyen de déterminer par programme lequel des
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
il y a un fichier et je n'ai pas trouvé de programme ou de bibliothèque capable de distinguer de manière fiable les trois encodages 8 bits différents. Nous avons probablement plus d'un millier de fichiers MacRoman à eux seuls, donc quel que soit le détecteur de jeu de caractères que nous utilisons, il doit être capable de les détecter. Rien de ce que j'ai regardé ne peut gérer le truc. J'avais de grands espoirs pour la bibliothèque de détecteurs de charset ICU , mais elle ne peut pas gérer MacRoman. J'ai aussi regardé des modules pour faire le même genre de chose en Perl et Python, mais encore et encore c'est toujours la même histoire: pas de support pour la détection de MacRoman.
Ce que je recherche donc, c'est une bibliothèque ou un programme existant qui détermine de manière fiable dans lequel de ces cinq encodages se trouve un fichier - et de préférence plus que cela. En particulier, il doit faire la distinction entre les trois encodages 3 bits que j'ai cités, en particulier MacRoman . Les fichiers sont à plus de 99% de texte en anglais; il y en a quelques-uns dans d'autres langues, mais pas beaucoup.
S'il s'agit de code de bibliothèque, notre préférence de langage est qu'il soit en Perl, C, Java ou Python, et dans cet ordre. S'il ne s'agit que d'un programme, alors nous ne nous soucions pas vraiment de la langue dans laquelle il se trouve tant qu'il est livré dans son intégralité, qu'il fonctionne sous Unix et qu'il est totalement libre.
Quelqu'un d'autre a-t-il eu ce problème d'un zillion de fichiers texte hérités encodés au hasard? Si oui, comment avez-vous tenté de le résoudre et dans quelle mesure avez-vous réussi? C'est l'aspect le plus important de ma question, mais je suis également intéressé à savoir si vous pensez qu'encourager les programmeurs à nommer (ou renommer) leurs fichiers avec l'encodage réel de ces fichiers nous aidera à éviter le problème à l'avenir. Quelqu'un a-t-il déjà essayé d'appliquer cela sur une base institutionnelle, et si oui, cela a-t-il réussi ou non, et pourquoi?
Et oui, je comprends parfaitement pourquoi on ne peut garantir une réponse définitive étant donné la nature du problème. C'est particulièrement le cas avec les petits fichiers, où vous ne disposez pas de suffisamment de données pour continuer. Heureusement, nos fichiers sont rarement petits. Mis à part le README
fichier aléatoire , la plupart ont une taille comprise entre 50k et 250k, et beaucoup sont plus grands. Tout ce qui dépasse quelques K est garanti en anglais.
Le domaine du problème est l'exploration de texte biomédicale, nous avons donc parfois affaire à des corpus étendus et extrêmement volumineux, comme tout le référentiel Open Access de PubMedCentral. Un fichier assez volumineux est le BioThesaurus 6.0, à 5,7 gigaoctets. Ce fichier est particulièrement ennuyeux car il est presque entièrement en UTF-8. Cependant, certains numbskull y sont allés et y ont collé quelques lignes qui sont dans un encodage 8 bits - Microsoft CP1252, je crois. Cela prend un certain temps avant de vous lancer sur celui-là. :(