Journal Comment identifier un encodage?

Posté par  .
Étiquettes : aucune
0
15
jan.
2004
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  (site web personnel, Mastodon) . Évalué à 3.

    si tu veux automaitser tous ça libiconv est faite pour toi.... elle est inclue dans glibc

    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  . Évalué à 2.

      En fait, je ne recherche pas le moyen de convertir un fichier d'un encodage
      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  (site web personnel) . Évalué à 1.

    Si tu y arrive, previens tout le monde en hurlant :)

    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  (site web personnel) . Évalué à 1.

      ps: je voulais rajouter: quand tu doit compiler dans un seul emplacement un nombre important de fichiers issus de charset différents, il est bien plus simple de tout convertir en UTF-16 (ou UTF-32) avant l'importation (par ex en se fiant au champ 'charset' d'un navigateur web).
    • [^] # Re: Comment identifier un encodage?

      Posté par  . Évalué à 2.

      La reconnaissance ne se fait effectivement que sur les 128 derniers caractères.

      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  . Évalué à 1.

    tu semble présuposer que
    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  . Évalué à 1.

      Je suppose effectivement qu'il s'agisse d'un texte littéraire (une ou plusieures langues)
      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  . Évalué à 2.

    Déjà si t'as des caractères compris entre 0x80 et 0x9F tu peux être sûr que c'est pas de l'iso-8859-x. C'est probablement un truc anti-standard de microsoft . Si tu vois des caractère 0xA4 dans de l'iso-8859-x c'est que t'as probablement à faire à du iso-8859-15 (0xA4 est l'€).
    • [^] # Re: Comment identifier un encodage?

      Posté par  . Évalué à 1.

      Déjà si t'as des caractères compris entre 0x80 et 0x9F tu peux être sûr que c'est pas de l'iso-8859-x. C'est probablement un truc anti-standard de microsoft

      ...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  . Évalué à 1.

    Tiens, je me demandais s'il existe des fonctions sous emacs et vi pour ecrire dans le fichier le charset utilisé ??
  • # Re: Comment identifier un encodage?

    Posté par  . Évalué à 1.

    Ca va pas servir à grand chose, mais je suis sûr d'avoir déjà vu une lib sous linux qui s'efforcait de déterminer l'encodage utilisé pour un texte quelconque. J'ai malheureusement aucune idée du nom de la lib, ou d'une url pour y accéder...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.