détecter l'encodage ?

tabliertablier Membre
18:46 modifié dans API AppKit #1
Je souhaite faire un string avec du texte contenu dans un fichier. L'encodage du texte n'est pas a priori connu. Si l'encodage était connu j'utiliserais:
NSError		*lerreur ;<br />NSString	*machin ;<br /><br />machin = [NSString stringWithContentsOfFile:chemin_Du_Ficher&nbsp; encoding:Encodage_Du_Ficher&nbsp; error:&amp;lerreur] ;


J'envisage donc de mettre le contenu du fichier dans un NSData, puis de faire des tests pour déterminer l'encodage du contenu.
Y-a-t-il une autre méthode pour trouver l'encodage?  :-\\

Réponses

  • AliGatorAliGator Membre, Modérateur
    18:46 modifié #2
    Hello,

    Les seules méthodes disponibles pour connaà®tre l'encodage d'un fichier :
    • Si c'est un fichier avec des métadonnées, l'encodage peut être dans les métadonnées. Exemple type : code source d'une page HTML, avec la balise <meta> qui peut préciser l'encodage. Sinon autre part dans le texte du fichier il se peut qu'il y ait l'information. Exemple "#VRML V2.0 utf8" pour les fichiers WRL -> c'est de l'UTF8. De même pour les fichiers XML l'encodage peut être indiqué. Etc.
    • Sinon, s'il y a un BOM au début du fichier, c'est l'encodage UTF8, UTF16LE ou UTF16BE selon la tronche du BOM. A noter que le BOM pour l'UTF8 n'est pas obligatoire et même déconseillé, donc son absence ne veux pas dire que ce n'est pas de l'UTF8
    • Sinon aucune méthode fiable à  100% ne permet de le déterminer... Et donc en dernier recours il ne te reste que la méthode statistique

    Cette dernière méthode consiste simplement à  effectuer des calculs statistiques sur le contenu de ton fichier texte "brut" et en particulier regarder certaines séquences d'octets (par exemple pour les lettres accentuées, la séquence d'octet va différer si c'est ISO-8851-1, UTF8 ou UTF16, ou autre), pour essayer de deviner l'encodage de texte le plus probable.
    Ca reste statistique donc de la probabilité et pas une méthode sûre à  100% mais c'est la seule méthode disponible quel que soit le type du fichier texte.

    Après il doit traà®ner j'imagine des codes sur le net pour effectuer ces statistiques. Tu peux affiner la probabilité de trouver le bon encodage si tu connais de plus la langue utilisée pour écrire le texte (anglais, français, chinois, ...)
  • schlumschlum Membre
    18:46 modifié #3
    Je rajoute une méthode, mais qui ne vaut pas grand chose car quasiment inconnue et rarement utilisée : il y a un champ textEncodingHint au niveau des infos catalogue du FS...
    http://developer.apple.com/documentation/Carbon/Reference/File_Manager/Reference/reference.html#//apple_ref/doc/constant_group/Catalog_Information_Bitmap_Constants
  • tabliertablier Membre
    18:46 modifié #4
    merci de vos réponses.
    Je pense qu'il ne reste que la méthode statistique. Dans l'explication du champ textEncodingHint, on trouve:
    The textEncodingHint field is used in conjunction with the Unicode filename of the object.

    Ce champ, qui est optionnel dans FSCatalogInfo, parait dédié au changement d'encodage des noms de fichiers, et non pas à  l'encodage des contenus.
    Bon, il faut que je m'y mette, hélas!  ???
  • schlumschlum Membre
    18:46 modifié #5
    Toutes mes confuses alors  ???

    Mais ça m'étonne, le nom est en UTF-16 décomposé au niveau FS à  priori...
  • AliGatorAliGator Membre, Modérateur
    18:46 modifié #6
    "in conjunction with" = avec.
    Pour moi ça veut dire que pour deviner l'encodage il s'aide des deux choses : la métadonnées TextEncodingHint ET le nom du fichier.
    Peut-être parce qu'il regarde l'extension du fichier pour essayer de voir ce qu'il est sensé contenir, ou qu'il sait que certains fichiers types (fichiers du système Unix par exemple) ont un encodage prédéfini (fstab, crontab, httpd, ...) ??

    Enfin bon de toute façon ça change rien je pense que la seule méthode valable est la méthode statistique, surtout si tu as l'air de dire que TextEncodingHint n'est pas toujours utilisé.
    (Ou alors regarder s'il est renseigner et s'il ne l'est pas tomber dans la méthode statistique... Ou l'utiliser pour alimenter le vecteur initial de la méthode statistique ?)
  • psychoh13psychoh13 Mothership Developer Membre
    18:46 modifié #7
    The textEncodingHint field is used in conjunction with the Unicode filename of the object.


    Non il ne se base pas sur le type du fichier, mais sur le nom du fichier. Il peut par exemple voir que le nom du fichier contient des caractères chinois, il va donc penser que le contenu du fichier est en chinois.
  • schlumschlum Membre
    18:46 modifié #8
    dans 1201440927:

    The textEncodingHint field is used in conjunction with the Unicode filename of the object.


    Non il ne se base pas sur le type du fichier, mais sur le nom du fichier. Il peut par exemple voir que le nom du fichier contient des caractères chinois, il va donc penser que le contenu du fichier est en chinois.


    Effectivement, ça doit être un truc du genre 
    Vu que l'encodage du nom de fichier est fixe et que l'unicode est bien découpé pour tous les alphabets du monde, ça doit pouvoir aider quand le nom est dans la langue native.
Connectez-vous ou Inscrivez-vous pour répondre.