Formulaire de contact

 

Case vide : problème d'encodage et solutions...

Case vide : problème d'encodage et solutions...




Dans le blog précédent, nous avons mentionné le problème de "case vide" concernant l'encodage. Et cette case vide nous obsède...



PLAN

Pourquoi elle est vide ?
Quelles sont les conséquences ?
Comment y résoudre ?


Pour répondre à ces questions, nous avons écrit un script pour tester et comparer des méthodes et des outils différents.

I Pourquoi elle est vide ?


Hypothèse 1 : la page n'a pas fourni son encodage dans l'entête.


Hypothèse 2 : l'outil que nous avons utilisé n'est pas propre.


Observation :
 


Il y a de nombreuses meta-données qui peuvent se confondre.
 




Analyse : Cela peut être lié à la syntaxe de HTML 4.

    HTML 4.01: <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    HTML5: <meta charset="UTF-8">
   
Solution : fouiller dans le fichier html la balise meta contenant l'encodage. (voir le script infra.


Désavantages : coûteux, moins efficace


II Quelles sont les conséquences ?


Hypothèse : des pages non utf-8 risquent d'être mal encodés lors de transformation.

Observation :




La commande lynx n'a pas pu décharger cette page.

Solution : il lui faut désigner l'encodage avec les options -assume_charset  et -display_charset. (voir le script infra.)


III Comment y résoudre ?


Autres que des solutions supra, nous avons testé 1) la commande file -i FILE, 2) récupérer l'encodage spécifié dans la balise meta de fichier html et 3) la commande enca -L args FILE (voir le script infra.). Nous avons également envisagé 4) la commande iconv mais ne l'avons pas encore testée.

1) file 

 
Désavantages : elle ne fonctionne que sur des fichiers locaux, ne peut pas tout connaître et fait des erreurs...

2) récupérer l'encodage spécifié dans la balise meta d'un fichier html.


Désavantages : coûteux, moins efficace. Quelque fois, l'encodage spécifié n'est pas le "vrai" encodage du fichier.

3) enca


Pour l'instant, elle fonctionne bien pour des URLs encodés en gbk/gb2312. elle est également capable de convertir des encodages.

Désavantages :
elle peut connaître l'encodage à condition que nous désignions par avance la langue de ce fichier.



4) iconv


La commande iconv ne servir qu'à convertir des encodages; elle ne peut pas simplement connaître l'encodage.


Le test est détaillé dans les commentaires du script.

SCRIPT

#!bin/bash
#Ce script permet de tester (DE MANIÈRE RUSTIQUE) l'encodage d'URLs avec des méthodes et des outils divers,
#et de trouver une solution éventuelle pour la suite de notre travail
#Contexte: 3 types de problèmes survenus lors de création de tableaux html
#1)certains urls ne répondent pas leur encodage dans l'entête récupéré par curl -I (cf notre blog précédent) ;
#2)certains sites (notamment des sites chinois avec gbk/gb2312 comme encodage) ne peuvent pas être déchargés par lynx.
#3)pour un même url, l'encodage de son texte déchargé diffère celui de sa page aspirée.
#pour y résoudre, il faut comparer des méthodes et des outils
#PATH=$PATH:~/home/.../ProjetEncadre20172018/Test/
#TESTÉ avec 8 urls : 4 chinois dont 3 en utf-8 et 1 en gb2312; 4 français dont 3 en utf-8 et 1 en iso-8859-1
#


echo "###########################################################################";
echo "test encoding... ";
echo "###########################################################################";
file=./URLs_test; 
rep_page_aspiree=./PAGE;
rep_dump_text=./TXT;
rep_transforme=./Trans_TXT;
echo "INPUT : URLs dans le fichire $file";
echo "OUTPUT : pages aspirées dans le rep $rep_page_aspiree";
echo "OUTPUT : textes déchargés dans le rep $rep_dump_text";
echo "###########################################################################";

    line_iterator=0;
    for line in `cat $file`
    do
        let line_iterator++;
        page="$rep_page_aspiree/aspiree-$line_iterator.html";
        dump="$rep_dump_text/dump-$line_iterator";
        txt_trans="$rep_transforme/trans-$line_iterator";
        
        ################################################################################
        
        echo "$line_iterator   $line";
        
        #method 1 : récupérer directement dans l'entête en envoyant une demande curl -I (ce que nous avons utilisé dans le blog précédent)
        encodage_header_curl=`curl -sIL $line|grep -i -Po '(?<=charset=).+(?=\b)' |awk '{print tolower($0)}'`;
        echo "method 1: $encodage_header_curl  : =>  curl -I header info charset";
        
        
        #method 2 :trouver dans la page html la ligne contenant la balise meta et l'encodage, puis récupérer l'encodage dans le fichier aspiré; 
        #1) trouver la chaîne qui correspond au motif 'meta.+charset' en ignorant la case, cela spécifie l'encodage paru dans la balise meta; 
        #2) récupérer l'ensemble de cette ligne et la transformer au miniscule 
        #3) trouver l'occurrence du motif "charset[=\s\'\"a-Z0-9\-]*" (en considérant des espaces, des guillemets).
        #4) récupérer l'encodage qui est délimité par =
        #5) enlever des espaces\guillemets éventuelles
        encodage_curl_page=`curl -sL $line|egrep -i 'meta.+charset' |awk '{print tolower($0)}'|egrep -o "charset[=\s\"a-Z0-9\-]*" |cut -d"=" -f2 | sed  's/\s//g'|sed 's/\"//g'`;
        echo "method 2: $encodage_curl_page : =>  parsing la page html with meta tag ";
        
        #method 3 : en principe, est de même que method 2, seule différence : fouiller dans la page locale
        curl -sL $line > $page;
        encodage_local_page=`egrep -i 'meta.+charset' $page |awk '{print tolower($0)}'|egrep -o "charset[=\s\"a-Z0-9\-]*" |cut -d"=" -f2 | sed  's/\s//g'|sed 's/\"//g'`;
        echo "method 3 : $encodage_local_page  : => parsing local page with meta tag";
        
        #method 4 : tester l'encodage de page aspirée avec la cmd file -i  (file ne fonctionne uniquement avec des fichiers locals)
        encodage_cmd_file=`file -i $page`;
        echo "method 4 : $encodage_cmd_file : => encodage de page locale interprétée par cmd file : ";
        
        #!!!!!!!!
        #method 5 : tester avec la cmd enca (fixons la langue en chinois, qui est l'origine de la plupart des problèmes) 
        #(ie. pour l'instant, pas de structure de contrôle, on ignore des url en fr)
        encodage_cmd_enca=`enca -L zh_CN $page`;
        echo "method 5 : $encodage_cmd_enca : =>  encodage_cmd_enca de page locale";
        ########################################################################################
       
        #désigner l'encodage par $encodage_curl_page
        lynx -dump -nolist -assume_charset=%{charset} -display_charset=$encodage_curl_page $line > $dump;
        
        ########################################################################################
        #voir l'encodage de texte déchargé par la cmd file
        encodage_texte_dump=`file -i $dump`;
        echo "Dump text en : $encodage_texte_dump   =>  par cmd file  ";
        # convertir l'encodage de texte déchargé vers utf8 par la cmd iconv
        # alternative : enca / utrac, 
        #txt_trans=`iconv -f $encodage_curl_page -t utf-8 $dump`;
        # voir l'encodage de texte après être transformé
        #encodage_txt_trans=`file -i $txt_trans`;
        #echo "Texte transformé en : $encodage_txt_trans   =>  transformé par iconv, vu par file  ";
        
        echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
        
    done;

TEST LOG


###########################################################################
test encoding... 
###########################################################################
INPUT : URLs dans le fichire ./URLs_test
OUTPUT : pages aspirées dans le rep ./PAGE
OUTPUT : textes déchargés dans le rep ./TXT
###########################################################################
1   http://paper.people.com.cn/rmrb/html/2017-08/19/nw.D110000renmrb_20170819_4-11.htm
method 1:   : =>  curl -I header info charset
method 2: utf-8 : =>  parsing la page html with meta tag 
method 3 : utf-8  : => parsing local page with meta tag
method 4 : ./PAGE/aspiree-1.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : 
method 5 : Universal transformation format 8 bits; UTF-8
  CRLF line terminators : =>  encodage_cmd_enca de page locale
Dump text en : ./TXT/dump-1: text/plain; charset=utf-8   =>  par cmd file  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2   http://finance.people.com.cn/n1/2016/1207/c1004-28931370.html
method 1:   : =>  curl -I header info charset
method 2: gb2312 : =>  parsing la page html with meta tag 
method 3 : gb2312  : => parsing local page with meta tag
method 4 : ./PAGE/aspiree-2.html: text/html; charset=iso-8859-1 : => encodage de page locale interprétée par cmd file : 
method 5 : Simplified Chinese National Standard; GB2312 : =>  encodage_cmd_enca de page locale
Dump text en : ./TXT/dump-2: text/plain; charset=iso-8859-1   =>  par cmd file  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3   http://zqb.cyol.com/html/2017-05/09/nw.D110000zgqnb_20170509_3-10.htm
method 1:   : =>  curl -I header info charset
method 2: utf-8 : =>  parsing la page html with meta tag 
method 3 : utf-8  : => parsing local page with meta tag
method 4 : ./PAGE/aspiree-3.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : 
method 5 : Universal transformation format 8 bits; UTF-8
  CRLF line terminators : =>  encodage_cmd_enca de page locale
Dump text en : ./TXT/dump-3: text/plain; charset=utf-8   =>  par cmd file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4   http://epaper.oeeee.com/epaper/H/html/2017-08/15/content_60134.htm
method 1:   : =>  curl -I header info charset
method 2: utf-8 : =>  parsing la page html with meta tag 
method 3 : utf-8  : => parsing local page with meta tag
method 4 : ./PAGE/aspiree-4.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : 
method 5 : Universal transformation format 8 bits; UTF-8
  Mixed line terminators : =>  encodage_cmd_enca de page locale
Dump text en : ./TXT/dump-4: text/plain; charset=utf-8   =>  par cmd file  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5   http://www.lemonde.fr/festival/article/2017/09/24/c-est-une-sex-doll-qui-fait-non-non-non_5190360_4415198.html?xtmc=intelligence_artificielle&xtcr=2
method 1: utf-8  : =>  curl -I header info charset
method 2: utf-8 : =>  parsing la page html with meta tag 
method 3 : utf-8  : => parsing local page with meta tag
method 4 : ./PAGE/aspiree-5.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : 
method 5 : Universal transformation format 8 bits; UTF-8 : =>  encodage_cmd_enca de page locale
Dump text en : ./TXT/dump-5: text/plain; charset=utf-8   =>  par cmd file  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6   http://www.lefigaro.fr/secteur/high-tech/2017/05/11/32001-20170511ARTFIG00013-microsoft-prepare-un-assistant-virtuel-pour-contrer-amazon-et-google.php
method 1: utf-8  : =>  curl -I header info charset
method 2: utf-8 : =>  parsing la page html with meta tag 
method 3 : utf-8  : => parsing local page with meta tag
method 4 : ./PAGE/aspiree-6.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : 
method 5 : Universal transformation format 8 bits; UTF-8 : =>  encodage_cmd_enca de page locale
Dump text en : ./TXT/dump-6: text/plain; charset=utf-8   =>  par cmd file  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7   http://next.liberation.fr/livres/2017/09/20/weyembergh-redessine-un-autre-futur_1597702
method 1: utf-8  : =>  curl -I header info charset
method 2: utf-8 : =>  parsing la page html with meta tag 
method 3 : utf-8  : => parsing local page with meta tag
method 4 : ./PAGE/aspiree-7.html: text/html; charset=utf-8 : => encodage de page locale interprétée par cmd file : 
method 5 : Universal transformation format 8 bits; UTF-8 : =>  encodage_cmd_enca de page locale
Dump text en : ./TXT/dump-7: text/plain; charset=utf-8   =>  par cmd file  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8   http://www.univ-paris3.fr/
method 1: iso-8859-1  : =>  curl -I header info charset
method 2: iso-8859-1 : =>  parsing la page html with meta tag 
method 3 : iso-8859-1  : => parsing local page with meta tag
method 4 : ./PAGE/aspiree-8.html: text/html; charset=iso-8859-1 : => encodage de page locale interprétée par cmd file : 
method 5 : Unrecognized encoding : =>  encodage_cmd_enca de page locale
Dump text en : ./TXT/dump-8: text/plain; charset=iso-8859-1   =>  par cmd file  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

REMARQUE


file fait des erreurs, par exemple, le URL N° 2 est encodé en gb2312, mais la commande l'a détecté comme iso-8859-1. Nous ne pouvons pas compter sur cette commande.

CONCLUSION

En conclusion, pour à la fois connaître et convertir des encodages, nous pouvons opter entre 

enca + iconv,
enca + enca,
2) + iconv et
2) + enca.


Pour la suite, nous allons intégrer ces méthodes/outils au fur et à mesure dans notre travail...

RÉFÉRENCES :

Total comment

Auteurs

AI_PLURITAL

0   commentaires

Cancel Reply