Au travail, il semble qu'il ne se passe pas une semaine sans qu'il y ait une connivence, une calamité ou une catastrophe liée au codage. Le problème provient généralement de programmeurs qui pensent pouvoir traiter de manière fiable un fichier "texte" sans spécifier l'encodage. Mais ce n'est pas le cas.
Il a donc été décidé d'interdire dorénavant aux fichiers d'avoir des noms qui se terminent en *.txt
ou *.text
. L'idée est que ces extensions induisent le programmeur occasionnel en erreur et le conduisent à une complaisance ennuyeuse à l'égard des codages, ce qui entraîne une manipulation inappropriée. Il serait presque préférable de ne pas avoir d'extension du tout, car au moins, vous connaître que tu ne sais pas ce que tu as.
Cependant, nous n'allons pas aller aussi loin. Au lieu de cela, vous devrez utiliser un nom de fichier qui se termine par l'encodage. Ainsi, pour les fichiers texte, par exemple, ce sera quelque chose comme README.ascii
, README.latin1
, README.utf8
etc.
Pour les fichiers qui exigent une extension particulière, si l'on peut spécifier l'encodage à l'intérieur du fichier lui-même, comme en Perl ou en Python, il faut le faire. Pour les fichiers tels que les sources Java, pour lesquels il n'existe pas de possibilité de spécifier l'encodage à l'intérieur du fichier, vous placerez l'encodage avant l'extension, comme par exemple SomeClass-utf8.java
.
Pour la sortie, UTF-8 doit être fortement préféré.
Mais pour l'entrée, nous devons trouver comment traiter les milliers de fichiers de notre base de code nommés *.txt
. Nous voulons tous les renommer pour les adapter à notre nouvelle norme. Mais nous ne pouvons pas tous les examiner à la loupe. Nous avons donc besoin d'une bibliothèque ou d'un programme qui fonctionne réellement.
Ceux-ci se présentent sous diverses formes : ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 ou Apple MacRoman. Bien que nous sachions que nous pouvons dire si quelque chose est en ASCII, et que nous avons de bonnes chances de savoir si quelque chose est probablement en UTF-8, nous restons perplexes quant aux encodages 8 bits. Comme nous travaillons dans un environnement Unix mixte (Solaris, Linux, Darwin) et que la plupart des ordinateurs de bureau sont des Mac, nous avons un certain nombre de fichiers MacRoman gênants. Et ceux-là en particulier posent problème.
Depuis un certain temps, je cherche un moyen de déterminer de manière programmatique quels sont les éléments de la base de données de l'entreprise.
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
et je n'ai pas trouvé de programme ou de bibliothèque capable de distinguer de manière fiable ces trois encodages 8 bits différents. Nous avons probablement plus d'un millier de fichiers MacRoman à eux seuls, donc le détecteur de jeu de caractères que nous utilisons doit être capable de les détecter. Rien de ce que j'ai regardé n'y parvient. J'avais de grands espoirs pour le Bibliothèque de détecteurs de jeux de caractères ICU mais il ne peut pas gérer le MacRoman. J'ai également cherché des modules pour faire le même genre de choses en Perl et en Python, mais c'est toujours la même histoire : pas de support pour détecter le MacRoman.
Je suis donc à la recherche d'une bibliothèque ou d'un programme existant qui détermine de manière fiable dans lequel de ces cinq codages se trouve un fichier - et de préférence plus que cela. En particulier, il doit faire la distinction entre les trois encodages de 3 bits que j'ai cités, notamment MacRoman . Les fichiers sont composés à plus de 99 % de textes en anglais ; il y en a quelques-uns dans d'autres langues, mais pas beaucoup.
S'il s'agit de code de bibliothèque, nous préférons qu'il soit en Perl, C, Java ou Python, et dans cet ordre. S'il s'agit simplement d'un programme, nous ne nous soucions pas vraiment du langage utilisé, du moment qu'il s'agit d'un code source complet, qu'il fonctionne sous Unix et qu'il n'est pas encombré.
Quelqu'un d'autre a-t-il eu ce problème d'un zillion d'anciens fichiers texte encodés de façon aléatoire ? Si oui, comment avez-vous essayé 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é de savoir si vous pensez qu'encourager les programmeurs à nommer (ou renommer) leurs fichiers avec l'encodage réel de ces fichiers nous aidera à éviter ce problème à l'avenir. Quelqu'un a-t-il déjà essayé de faire respecter cette règle au niveau institutionnel, et si oui, est-ce que cela a été le cas ? que réussi ou non, et pourquoi ?
Et oui, je comprends parfaitement pourquoi on ne peut pas garantir une réponse définitive étant donné la nature du problème. C'est notamment le cas pour les petits fichiers, pour lesquels vous n'avez pas assez de données pour avancer. Heureusement, nos fichiers sont rarement petits. En dehors du hasard README
La plupart des fichiers sont d'une taille comprise entre 50 000 et 250 000, mais beaucoup sont plus volumineux. Tout ce qui fait plus de quelques kilomètres est garanti en anglais.
Le domaine du problème est l'exploration de textes biomédicaux, ce qui nous amène parfois à traiter des corpus étendus et extrêmement volumineux, comme l'ensemble du référentiel en libre accès de PubMedCentral. Un fichier assez énorme est le BioThesaurus 6.0, qui pèse 5,7 gigaoctets. Ce fichier est particulièrement gênant car il est presque tous UTF-8. Cependant, une tête de linotte y a collé quelques lignes qui sont dans un encodage 8 bits - Microsoft CP1252, je crois. Il faut un certain temps avant que vous ne trébuchiez sur celui-ci :(
0 votes
Voir stackoverflow.com/questions/4255305/ pour une solution