Une question me tarabuste en ce moment : comment reconnaître l'encodage d'un fichier texte (ISO-8859-x, CP 125x, Mac...)? Quelqu'un a-t-il déjà implémenté un algorithme de ce type? J'ai eu beau chercher, j'ai pas trouvé grand chose qui correspondait à mes attentes...
On pourrait cependant imaginer quelques solutions :
- Une reconnaissance de mots à partir de dictionnaires : super lourd, il faudrait un dico par langue supportée... c'est quand même la solution choisie par quelques softs commerciaux spécialisés dans la reconnaissance de langue (et accessoirement de charset) ;
- Calculer la fréquence de chaque caractère, comparer les résultats avec des "empreintes" pour chaque langue et en déduire la langue puis le charset: si on a par exemple une majorité de 0xE0, E8, E9 parmi les octets supérieurs à 0x80, on peut déduire qu'on a du français et du ISO-8859-1 ou CP1252 (correspondance avec "à, é, è"): le problème est que si on a affaire à un document multi langue (par ex une base de donnée sur des personnes en europe, le genre de truc dont je m'occupe en ce moment), les résultats doivent être completement faussés!
- A partir du type de chaque caractère pour chaque charset (majuscule, minuscule, signes, espace, caractère de contrôle...) on remplace les charactères du texte par leur type et on voit si ça colle : la séquence "espace, maj, min,min,min,min, espace" à plus de chance de coller que "espace, maj, min,min,maj, min, espace" ou que "espace, maj, min,min, signe,min, espace". Je suis pas mal sur cette solution en ce moment, mais les résultats sont mitigés et je ne souhaite pas rentrer dans des algos trop compliqués qui dépendent fortement de chaque langue.
Voilà, si il y en a qui ont d'autres solutions à proposer, je suis preneur... je distribuerai des paquets d'aspirine comme récompense s'il m'en reste...
# Re: Comment identifier un encodage?
Posté par kolter (site web personnel, Mastodon) . Évalué à 3.
iconv : executable en ligne de commande pour changer "l'encodage" d'un fichier vers un autre.... (voir man 1 iconv)
si tu veux programmer tous ça en C :
+ man 3 iconv
+ man 3 iconv_open
+ man 3 iconv_close
sachant que ça existe aussi dans d'autres langages.....
en esperant que cela t'aide...
M.
[^] # Re: Comment identifier un encodage?
Posté par calandoa . Évalué à 2.
vers un autre, mais de reconnaître l'encodage d'un fichier. L'idée est de
pouvoir charger un fichier dans un soft sans imposer à l'utilisateur de choisir
l'encodage, ou tout au mois de lui proposer le plus probable, ce qui est un
peu plus chaud (et intéressant) .
Sinon dans le même genre qu'iconv, il y a recode sur lequel je suis tombé
dans mes recherches : http://recode.progiciels-bpi.ca/(...)
qui est pas mal mais je n'ai pas réussi à compiler la version en download sur
le site, il faut en chercher une autre je ne sais plus où...
# Re: Comment identifier un encodage?
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 1.
je tiens a te signaler quand meme que tous les charset (y compris les unicodes) partagent les memes codes ascii,
Bon les fichiers encodés en UTF-16, UTF-32 sont relativement reconnaissables (bcp bcp d'octets null entre des caractères) mais pour les autres il est assez facile (IIRC) de presenter deux fichiers contenants les memes codes (pas dans le meme ordre) mais ayant un charset et un sens différent.
C'est d'ailleurs pour cela que tout les outils necessitent une spécification a-priori du charset d'entrée.
[^] # Re: Comment identifier un encodage?
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 1.
[^] # Re: Comment identifier un encodage?
Posté par calandoa . Évalué à 2.
Pour l'utf, même l'utf8 est facilement reconnaissable, car tous les chars>128
doivent être ordonnés de manière particulière. Le problème est effectivement
pour les autre charsets, et il n'y a sûrement pas d'algo magique (car plusieurs
charsets possible dans les cas particuliers), mais il est possible de noter chaque
version d'un document source dans les différents charsets et d'en choisir le
meilleur... et si il n'est pas possible de départager dans les cas particuliers, on
doit alors laisser l'utilisateur se débrouiller avec ces noms barbares :)
Maintenant je cherche l'algo (ou les algos) permettant sans trop se compliquer la
vie de noter avec une exactitude satisfaisante.
Si j'arrive à quelque chose de concluant, je diffuserais la bibliothèque, bien que vu
comme c'est parti l'api risque d'être assez bordélique...
# Re: Comment identifier un encodage?
Posté par grafit . Évalué à 1.
1. le texte est littéraire (un seul langage, pas de code, diagrammes, etc...)
2. c'est du texte pur (pas de formatage, ...)
Tu peux toujours regarder ce que fait file(1).
Mais à priori, la solution miracle "sans algos trop compliqués" c'est un enCODEage UNIque.
[^] # Re: Comment identifier un encodage?
Posté par calandoa . Évalué à 1.
ou d'une base de données contenant des noms, adresses, téléphones, email, etc...
Mais le cas d'un texte formatté ou par exemple d'un source en C ne posent
pas de problèmes car tous les signes, mot clés, ponctuations tordues sont en
général codés avec les caractères inférieurs à 128, càd ascii, et les différences
entre charsets ne concernent que les caractères entre 128 et 255 (à part l'utf,
reconnaissable facilement par d'autres manières et qqs charsets préhistoriques :),
ça n'est donc que sur ces caractères (et peut être leur contexte, à priori du texte
"littéraire") que va se faire la reconnaissance. Celle ci ne sera pas parfaite (cf plus
haut) mais tant qu'elle marche dans la majorité des cas...
Quant à l'unicode, c'est effectivement la solution pour exporter un fichier, mais
pas pour l'importer, ou tout au moins pas tant que les autres charsets ne seront
pas morts et enterrés (et pour l'instant c'est pas gagné...)
# Re: Comment identifier un encodage?
Posté par Bernez . Évalué à 2.
[^] # Re: Comment identifier un encodage?
Posté par calandoa . Évalué à 1.
...ou Mac, mais sur ce point là je leur donne entièrement raison. Ces caractères interdits sont en fait des caractères de contrôles antédiluviens. La seul doc que j'ai trouvée dessus date de 1983 (http://www.itscj.ipsj.or.jp/ISO-IR/077.pdf(...))
L'emplacement 80-9F a été choisi car si un texte contenant ces caractères passait par erreur par un filtre 7 bits, on aurait obtenu des caractères de contrôles 00-1F qui aurait pu fortement changer la mise en page du document... pour moi cette raison n'est pas suffisante pour se priver de 32 caractères sur 256, déjà que la plupart des caractères 00-1F ne servent à rien... c'était peut être valable il y a quelque temps, mais c'est maintenant un boulet qu'on traine... et cette plage interdite a encore été incluse dans l'unicode (mais là c'est moins grave : on a en gros 2^32 caractères possibles...)
Quelques sites en vrac:
guide très complets sur les charsets: http://www.cs.tut.fi/~jkorpela/chars/index.html(...)
autre guide (en ce moment dans les choux) : http://www.diffuse.org/charguide.html(...)
description de charsets et de leur utilisation selon les langues: http://www.eki.ee/letter/(...)
le projet unicode: http://www.unicode.org(...)
liste de caractères unicode: http://www.alanwood.net/unicode/(...)
# Re: Comment identifier un encodage?
Posté par KiKouN . Évalué à 1.
[^] # Re: Comment identifier un encodage?
Posté par account . Évalué à 1.
# Re: Comment identifier un encodage?
Posté par Christophe Fergeau . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.