Cases vides bien remplies,
textes non-utf8 bien convertis
Dans le blog du 30 octobre, nous avions mentionné le problème de "case vide" concernant l'encodage. Et cette case vide nous obsédait...
Dans le blog du 1 novembre, nous avons donc écrit un script pour tester et comparer des méthodes et des outils différents pour éventuellement résoudre ces problèmes.
Dans ce blog, il est temps de mettre en oeuvre des solutions que nous avons envisagées...
PLAN
PROBLÈMES ET SOLUTIONS
MISE EN OEUVRE
I PROBLÈMES ET SOLUTIONS
Il existe notamment deux types de problèmes :
1.1 Encodage
Encodage non-connu dans l'entête de la réponse de curl -I
Encodage non-utf8
1.2 Dump
Certains textes ne pouvaient pas être déchargés simplement par lynx -dump -nolist
Grosso modo, nous avons analysé leurs causes et conséquences, et écrit un scrpit pour tester et comparer quelques solutions.(le détail : cf le blog du 1 novembre.
II MISE EN OEUVRE
Dans cette partie, nous allons expliquer nos choix.
2.1 Structures de contrôle
Autres que les structures de contrôle for et while, il existe aussi if, qui a des formats suivants :
if-then,
if-then-else,
if-then-elif-then-else (elif-then peut se répéter)
Bash exécute la commande définie dans la ligne if, si le code de retour de cette commande (ou de ce pipeline) est à 0 ( qui veut dire la bonne exécution de commande, cf le détail), les commandes défines dans la partie then seront exécutées ; Sinon, Bash va déplacer dans les parties suivantes (elif/else).
Crochet [ ] et double crochet [[ ]]
Crochet est synonyme de la commande test. (Nous pouvons ajouter une condition de test dans les crochets)
Double crochet permet la comparaison avancée des chaînes de caractères, à savoir pattern matching ( nous pouvons définir une RegExp comme motif)
Combinaisons de conditions par opérateurs Booléens
Dans notre cas, nous avons utilisé le &&.
Dans notre script, nous avons utilisé cette structure pour évaluer et traîter des situations variées.
code_retour (200 ou non)
encodage (utf8 / autre encodage non vide / vide)
nom du fichier (chinois ou non)
Nous allons déssiner un schéma après avoir intégré toutes les colonnes prochainement.
2.2 Encodage
Nous avons envisagé plusieurs moyens pour connaître l'encodage d'un fichier :
1) récupérer dans l'entête
encodage=`curl -sIL $line|grep -i -Po '(?<=charset=).+(?=\b)' |awk '{print tolower($0)}'`;
2) récupérer dans la balise meta en parcourant le fichier html
encodage=`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'`;
3) utiliser la commande file -i sur des fichiers locaux
encodage=`file -i $page`;
4) utiliser la commande enca -L zh_CN sur des fichiers chinois
encodage=`enca -L zh_CN $page`;
Selon notre teste, la commande file fait des erreurs, enca ne fonctionne bien que pour les fichiers chinois, le parcours dans des fichiers html est coûteux, l'encodage spécifié dans la balise meta n'est pas forcément l'encodage du fichier...
Notre choix est donc le résultat d'un compromis de ces contraintes.
Quant à la conversion d'encodages, nous avons simplement deux choix :
Pour les fichiers chinois, nous utilisons la commande enca ;
Pour les autres, nous optons pour la commande iconv.
2.3 Dump
Il serait préférable d'ajouter deux options supra pour la commande lynx afin d'éviter des décharges "vides" ou mal-encodés car l'encodage officiel par défaut de HTTP est iso-8859-1, tandis que certaines pages non-anglais ont "oublié" de spécifier leur propre encodage.
-assume_charset
-display_charset
2.4 Script (et paramètre)
Mise à jour de la version 20171102
i Ajouter des structures de contrôle
ii Etre capable de récupérer des encodages qui ne sont pas parus dans l'entête par la réponse de curl -IL (chercher dans la balise meta de fichier html)
iii Etre capable de convertir tous les textes non-utf8 en utf8 à l'aide de commandes enca et iconv
iv Ajouter la colonne Dump_utf8 pour montrer tous les texts en utf8
v Modifier la colonne Dump comme Dump initial, pour montrer uniquement des textes non-utf8
vi Modifier la colonne encodage comme encodage initial, pour montrer l'encodage des fichiers non-utf8
Paramètre
./PROGRAMMES/20171102_parametres./URLS ./TABLEAUX/20171102_Tableaux ./PAGES-ASPIREES ./DUMP-TEXT
Script
./RPOGRAMMES/20171102_CreationTableau_8cols_alpha.sh#!bin/bash #PATH=$PATH:~/home/.../PROJET_MOT_SUR_LE_WEB #./PROGRAMMES/20171102_CreationTableau.sh #parametre : ./PROGRAMMES/20171102_parametres #EXECUTION #bash ./PROGRAMMES/20171102_CreationTableau_8cols_alpha.sh < ./PROGRAMMES/20171102_parametres #VERSION 20171102 ################################################################################ #MISE A JOUR : #i Ajouter des structures de contrôle #ii Etre capable de récupérer des encodages qui ne sont pas parus dans l'entête par la rếponse de curl -IL # (chercher dans la balise meta de fichier html) #iii Etre capable de convertir tous les textes non-utf8 en utf8 à l'aide de commandes enca et iconv #iv Ajouter la colonne Dump_utf8 pour montrer tous les texts en utf8 #v Modifier la colonne Dump comme Dump initial, pour montrer uniquement des textes non-utf8 #vi Modifier la colonne encodage comme encodage initial, pour montrer l'encodage des fichiers non-utf8 ################################################################################ echo "Création d'une page html contenant trois tableaux "; read rep; read table; read rep_page_aspiree; read rep_dump_text; echo "INPUT : nom du répertoire contenant des fichiers d'URLs : $rep"; echo "OUTPUT : nom du fichier html contenant des tableaux : $table"; echo "OUTPUT : nom du répertoire stockant les pages aspirées : $rep_page_aspiree"; echo "OUTPUT : nom du répertoire stockant les texts dump : $rep_dump_text"; echo -e "\n\n\n\n\nVeuillez patienter quelques instants.\n\n\nTravail en mode silence...\n\n\n"; ################################################################################ echo -e "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Tableau URLs</title>\n\t\t<meta charset = 'utf-8'>\n\t</head>\n" > $table; echo -e "\t<body>\n\t\t<h2 align=\"center\">Tableaux des URLs de teste</h2>" >> $table; for file in `ls $rep` { #let "table_iterator = table_iterator++"; echo -e "\t\t<table border = \"1\" bordercolor = \"#47baae\" width = \"80%\" align = \"center\">" >> $table; echo -e "\t\t\t<tr height = \"30px\" bgcolor = \"#47baae\"><th colspan = \"8\">Tableau-$file</th></tr>" >> $table; echo -e "\t\t\t<tr>\n\t\t\t<th width = \"3%\" align = \"center\">N°</th>" >> $table; echo -e "\t\t\t\t<th width = \"7%\" align = \"center\">Code_retour</th>" >> $table; echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Etat_de_lien</th>" >> $table; echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Lien</th>" >> $table; echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Page_aspirée</th>" >> $table; echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Encodage_initial</th>" >> $table; echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Dump_initial</th>" >> $table; echo -e "\t\t\t\t<th width = \"15%\" align = \"center\">Dump-utf8</th>\n\t\t\t</tr>" >> $table; line_iterator=0; for line in `cat $rep/$file` { let line_iterator++; #2 variables, 1 pour la page aspirée, 1 pour le text dump page="$rep_page_aspiree/20171102-$file-aspiree-$line_iterator.html"; dump="$rep_dump_text/20171102-$file-dump-$line_iterator"; #Demande la réponse de requête, [OPTION]de cURL -s: en mode silence; #-I:récupérer seulement l'entête info de HTTP; -L: relancer la requête de curl #en cas de rédirections; le motif 'HTTP\/[0-9]\.[0-9]'correspond aux protocaux #HTTP/0.9 HTTP/1.1 HTTP/2.0 etc. #awk '{print $2} imprimer la deuxième "colonne" dans une ligne du type suivant : HTTP/1.1 200 OK, ie. le http_code # sed 's/\n/\t/g' et 's/\r/\t/g' remplacer des passages à la ligne par une tabulation pour que plusieurs valeurs soient dans la même ligne lien_statut=`curl -sIL $line|egrep -i 'HTTP\/[0-9]\.[0-9]'| awk '{print $0}' | sed 's/\n/\t/g'|sed 's/\r/\t/g'`; #Demander le http_code (et supprimer des passages à la ligne), #aspirer la page html et la rédiriger avec le nom $page code_retour=`curl -sL -o $page -w "%{http_code}" $line | sed 's/\n//g'|sed 's/\r//g'`; echo "Etat de lien : $lien_statut"; #test, à enlever après echo "Code_retour : $code_retour"; #test, à enlever après # echo "################################################################"; #condition code_retour == 200, => verifier $encodage if [[ $code_retour == 200 ]] ;then #Demander l'encodage #encodage_header_curl encodage=`curl -sIL $line|grep -i -Po '(?<=charset=).+(?=\b)' |awk '{print tolower($0)}'`; echo "encodage récupéré de l'entête : $encodage"; #test, à enlever après #condition $encodage == utf8, => dump if [[ $encodage == "utf-8" ]] ;then #il faut désignier le jeu de caractères pour la commande lynx car quelques fois lynx ne peux pas réussir à décharger des textes sans connaissances d'encodages préalables lynx -dump -nolist -assume_charset=%{charset} -display_charset=$encodage $line > $dump-utf8; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$page">20171102-$file-aspiree-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump-utf8">20171102-$file-dump-$line_iterator-utf8</a></td>\n\t\t\t</tr>" >> $table; #condition non-utf8 && non vide => vérifier l'existence de $encodage dans la liste d'iconv elif [[ $encodage != "utf-8" ]] && [[ $encodage != "" ]] ;then #chercher l'encodage dans la liste des encodages de iconv verification_iconv=`iconv -l | egrep -io $encodage | sort -u`; # condition $encodage connu par iconv => dump et convertir en utf8 if [[ $verification_iconv != "" ]] ; then lynx -dump -nolist -assume_charset=%{charset} -display_charset=$encodage $line > $dump-$encodage; #transformer l'encodage de texte déchargé vers utf8 par la commande iconv # [OPTION] -f, from (de tel encodage); -t to (à tel encodage) iconv -f $encodage -t utf-8 $dump-$encodage > $dump-utf8; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$page">20171102-$file-aspiree-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump-$encodage">20171102-$file-dump-$line_iterator-$encodage</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump-utf8">20171102-$file-dump-$line_iterator-utf8</a></td>\n\t\t\t</tr>" >> $table; #condition $encodage non connu par iconv => rien à faire, seulement remplir les tableaux avec des infos necessaires else echo "Echec : $encodage inconnu..."; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>\n\t\t\t</tr>" >> $table; fi # condition pas de $encodage dans la réponse de curl -I, récupérer $encodage directement dans la balise meta de la page html (locale) elif [[ $encodage == "" ]] ;then encodage=`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'`; #condition $encodage utf8 dump echo "encodage récupéré de page html : $encodage"; echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; if [[ $encodage == "utf-8" ]] ;then lynx -dump -nolist -assume_charset=%{charset} -display_charset=$encodage $line > $dump-utf8; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$page">20171102-$file-aspiree-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump-utf8">20171102-$file-dump-$line_iterator-utf8</a></td>\n\t\t\t</tr>" >> $table; #condition non-utf8 && non vide => dump elif [[ $encodage != "utf-8" ]] && [[ $encodage != "" ]] ;then lynx -dump -nolist -assume_charset=%{charset} -display_charset=$encodage $line > $dump-$encodage; # #condition fichier d'URLS est en chinois, utiliser enca pour convertir (enca fonctionne mieux que iconv lors de traitement de fichier chinois) if [[ "$file" == "CN*" ]] ;then #transformer l'encodage de texte déchargé vers utf8 par la commande enca #il faut désignier la langue de fichier, ie zh_CN pour le chinois enca -L zh_CN utf-8 -x < $dump-$encodage > $dump-utf8; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$page">20171102-$file-aspiree-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump-$encodage">20171102-$file-dump-$line_iterator-$encodage</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump-utf8">20171102-$file-dump-$line_iterator-utf8</a></td>\n\t\t\t</tr>" >> $table; # condition pour les autres fichiers, vérifier l'encodage à l'aide de liste des encodages de iconv puis décharger else verification_iconv=`iconv -l | egrep -io $encodage | sort -u`; if [[ $verification_iconv != "" ]] ; then lynx -dump -nolist -assume_charset=%{charset} -display_charset=$encodage $line > $dump-$encodage; iconv -f $encodage -t utf-8 $dump-$encodage > $dump-utf8; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$page">20171102-$file-aspiree-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump-$encodage">20171102-$file-dump-$line_iterator-$encodage</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = ".$dump-utf8">20171102-$file-dump-$line_iterator-utf8</a></td>\n\t\t\t</tr>" >> $table; else echo "Echec : $encodage inconnu..."; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>\n\t\t\t</tr>" >> $table; fi fi else echo "Echec : $encodage inconnu..."; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">-</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$encodage</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>\n\t\t\t</tr>" >> $table; fi fi else # condition état de lien autre que 200, rien à faire, seulement imprimer son numéro, son code_retour, son état et son lien. echo "Echec : $lien_statut"; echo -e "\t\t\t<tr>\n\t\t\t\t<td align = \"center\">$line_iterator</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$code_retour</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">$lien_statut</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\"><a href = '$line'>20171102-$file-lien-$line_iterator</a></td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>" >> $table; echo -e "\t\t\t\t<td align = \"center\">null</td>\n\t\t\t</tr>" >> $table; fi } echo -e "\t\t</table>\n" >> $table; echo -e "\t\t<br/>\n\t\t<hr width = \"80%\" color = \"#47baae\" cb 9 size = \"10\">\n\t\t<br/>" >> $table; #horizontal rule } echo -e "\t</body>\n</html>" >> $table; echo "Fin de création des tableaux.";
2.5 Exécution
Environement de travail~/Documents/20172018-S1/06-Projet_Encadre/PROJET_MOT_SUR_LE_WEB$ tree -d
.
├── CONTEXTES
├── DUMP-TEXT
├── IMAGES
├── PAGES-ASPIREES
├── PROGRAMMES
├── TABLEAUX
└── URLS
7 directories
Exécution
~/Documents/20172018-S1/06-Projet_Encadre/PROJET_MOT_SUR_LE_WEB$ bash ./PROGRAMMES/20171102_CreationTableau_8cols_alpha.sh < ./PROGRAMMES/20171102_parametres Création d'une page html contenant trois tableaux INPUT : nom du répertoire contenant des fichiers d'URLs : ./URLS OUTPUT : nom du fichier html contenant des tableaux : ./TABLEAUX/20171102_Tableaux OUTPUT : nom du répertoire stockant les pages aspirées : ./PAGES-ASPIREES OUTPUT : nom du répertoire stockant les texts dump : ./DUMP-TEXT Veuillez patienter quelques instants. Travail en mode silence... Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : encodage récupéré de page html : utf-8 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : encodage récupéré de page html : utf-8 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : encodage récupéré de page html : utf-8 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : encodage récupéré de page html : gb2312 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : encodage récupéré de page html : gb2312 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : utf-8 Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : utf-8 Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : utf-8 Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : utf-8 Etat de lien : HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : utf-8 Etat de lien : HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK Code_retour : 200 encodage récupéré de l'entête : utf-8 Fin de création des tableaux.
2.6 Résultat
La page html de trois tableaux de 8 colonnes :Le code source de la page
Une page non-utf8 (GB2312) aspirée (colonne 5)
Son texte initial déchargé (colonne 7)
Son texte converti en utf8 (colonne 8)
RÉFÉRENCES
https://www.w3.org/International/articles/http-charset/indexhttp://lynx.invisible-island.net/lynx2.8.5/lynx_help/Lynx_users_guide.html
https://linux.die.net/man/1/enca
Tushar, S. (2013). Linux Shell Scripting Cookbook. Packt Publishing Ltd.