<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1111"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1111/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1111/atom/feed</id>
  <updated>2008-09-06T23:42:14+02:00</updated>
  <entry>
    <title>Fixer les problèmes d&#039;encodage</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1111" />
    <id>http://artisan.karma-lab.net/node/1111</id>
    <published>2008-09-05T10:42:26+02:00</published>
    <updated>2008-09-06T23:42:14+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Formats et Standards" />
    <category term="drupalfr.org" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
Aujourd'hui la majorité des grandes distributions est passée à l'encodage <a class='external' target='_blank' href='http://artisan.karma-lab.net/node/1105#utf' >UTF-8</a>, permettant l'affichage propre d'un large panel de symboles linguistiques. Maintenant lorsqu'il s'agit de vieux systèmes mis à jour, ou quant l'on en vient à utiliser des fichiers provenant notamment du monde Windows, il peut être utile de savoir comment unifier les encodages de sorte à garder un système de fichier propre. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
Aujourd'hui la majorité des grandes distributions est passée à l'encodage <a class='external' target='_blank' href='http://artisan.karma-lab.net/node/1105#utf' >UTF-8</a>, permettant l'affichage propre d'un large panel de symboles linguistiques. Maintenant lorsqu'il s'agit de vieux systèmes mis à jour, ou quant l'on en vient à utiliser des fichiers provenant notamment du monde Windows, il peut être utile de savoir comment unifier les encodages de sorte à garder un système de fichier propre. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Régler l'encodage du système</h2>
	
<p>
  La première chose à vérifier est que le système est bien en UTF. Certains système que l'on a mis à jour à la main, sans passer par un ré-installation complète restent encore en ISO-8859-15. C'était mon cas pour une vielle configuration que j'avais fait progresser de Mandriva 7.2 jusqu'à aujourd'hui (on ne rigole pas <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>. 
</p>
<p>
  Sous Mandriva, il faut vérifier le fichier <kbd>/etc/sysconfig/i18n</kbd> qui doit contenir quelque chose comme cela :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re2">LC_TELEPHONE=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_CTYPE=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LANGUAGE=</span>fr_FR.UTF<span class="nu0">-8</span>:fr<br />
<span class="re2">LC_MONETARY=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_ADDRESS=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_COLLATE=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_PAPER=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_NAME=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_NUMERIC=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">SYSFONT=</span>lat0<span class="nu0">-16</span><br />
<span class="re2">LC_MEASUREMENT=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_TIME=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LANG=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_IDENTIFICATION=</span>fr_FR.UTF<span class="nu0">-8</span><br />
<span class="re2">LC_MESSAGES=</span>fr_FR.UTF<span class="nu0">-8</span>
  </div>
  
  </div>
</p>
<p>
  Après cela, on fait comme pour Windows, on reboot <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> et le système passe tout seul en UTF-8. Une chose de faite...
</p>
<p>
  SI même après cela vous êtes toujours en ISO en tant qu'utilisateur (pour savoir cela, lancez la commande <kbd>locale</kbd> dans une console non-root, vous devriez voir des <kbD>fr_FR.UTF-8</kbd> apparaître), c'est sûrement que vous avez une configuration locale à votre compte. Regardez si vous n'auriez pas un fichier <kbd>~/.i18n</kbd> et si c'est le cas, supprimez-le, déconnectez-vous et reconnectez-vous. 
</p>

<div class='inline-box note'>
  Sous un Windows XP récent, les systèmes de fichiers sont je crois maintenant encodés en UTF-8, de même que les partages. En revanche, il y a un hic avec Java qui persiste pour des raisons historiques à rester en ISO. Du coup, un environnement de développement comme Eclipse est spontanément ISO ce qui est loin d'être une idée de génie. Pour changer cela, il faut aller dans le paramétrage d'Eclipse, section Workspace, et changer l'encodage global de l'espace de travail. Cela ne va cependant pas modifier les fichiers déjà écrits en ISO mais juste assurer que l'encodage des prochains seront en UTF.
</div>


	<a name='chapter_2'></a>
  <h2>Les noms de fichiers</h2>
	
<p>
  Une fois que le système est clairement en UTF-8, le point suivant sont les noms de fichiers. Soit, comme pour le point précédent, il s'agit d'un "vieux" système de fichier, soit plus régulièrement, c'est un Windowsien qui vous envoie une archive type Zip qui contient des encodages ISO et qui se décompresse tel-quel sur votre système de fichiers UTF-8. 
</p>
<p>
  Dans un cas, comme dans l'autre, il nous faut donc convertir chaque noms de fichier (pas leur contenu) en les renommant ce qui serait un peu fastidieux. Heureusement, une bonne âme a construit un outil qui remplis parfaitement cette tâche, <kbd>convmv</kbd>. Soit vous pouvez directement installer le paquet (ex. sous Mandriva, par un <kbd>urpmi convmv</kbd>), soit par les <a class='external' target='_blank' href='http://www.j3e.de/linux/convmv/' >sources</a>. Ensuite, la syntaxe est la suivante :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">cd</span> mon_dossier_a_convertir<br />
convmv --notest -r -f iso<span class="nu0">-8859</span><span class="nu0">-15</span> -t utf<span class="nu0">-8</span> <span class="sy0">*</span>
  </div>
  
  </div>
</p>
<p>
  Les options <kbd>-f</kbd> et <kbd>-t</kbd> représentent respectivement l'encodage source (iso-8859-15) et cible (utf-8). L'option <kbd>notest</kbd> indique à l'outil que ce n'est pas une simulation (enlever cette option si vous voulez vérifier que tout se passe bien). L'option <kbd>-r</kbd> demande à traiter le dossier ainsi que tous les sous-dossier (récursif), à enlever donc si vous ne souhaiter traiter que le dossier courant. Enfin <kbd>*</kbd> indique qu'il fait traiter tout les fichiers, et il peut être remplacé par le nom d'un fichier unique à convertir. 
</p>
<p>
  Une fois l'opération terminé, vos noms fichiers doivent être lisibles. 
</p>


	<a name='chapter_3'></a>
  <h2>Conversion des contenus</h2>
	
<p>
   Là, nous sortons un peu du cadre de l'OS car les contenus textes sont très logiquement géré par les applications idoines. Pour convertir un contenu ISO en UTF, la commande magique est <kbd>iconv</kbd> utilisable comme ceci :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  iconv --from-<span class="re2">code=</span>ISO<span class="nu0">-8859</span><span class="nu0">-1</span> --to-<span class="re2">code=</span>UTF<span class="nu0">-8</span> ancien_fichier.java -o .<span class="sy0">/</span>nouveau_fichier.java
  </div>
  
  </div>
</p>
<p>
  <kbd>iconv</kbd> est globalement moins sympa que <kbd>convmv</kbd> :
<ul>
<li>Pas de mode récursif.</li>
<li>Impossible d'écrire le fichier sur lui-même que ce soit par une redirection ou un <kbd>-o</kbd>, la sanction serait un fichier vide <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/></li>
<li>Aucune vérification sur le fait que le fichier source soit effectivement codé en ISO.</li>
</ul>
</p>
<p>
  Au fond, le vrai point problématique est le dernier, mais là, iConv n'y est pour rien. En effet, il n'y a aucun moyen fiable de savoir avec quel format est encodé un fichier texte. Il existe tout au plus des algorithmes permettant de le "deviner" mais plus le texte est cours, moins l'algorithme fonctionnera. 
</p>
<p>
  En somme, si vous avez un fichier ISO parmi une série d'UTF à convertir, utilisez la syntaxe précédente, quitte à gommer les deux premiers points par un petit script que vous pouvez par exemple coller dans <a class='external' target='_blank' href='/node/1323%2523scripts' >les scripts Nautilus</a> pour les avoir sur un click-droit :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<br />
logger <span class="re1">$PWD</span> $<span class="nu0">1</span><br />
iconv &nbsp;--from-<span class="re2">code=</span>ISO<span class="nu0">-8859</span><span class="nu0">-1</span> --to-<span class="re2">code=</span>UTF<span class="nu0">-8</span> <span class="st0">&quot;$1&quot;</span> <span class="sy0">&gt;</span> &nbsp;~<span class="sy0">/</span>tmp<span class="sy0">/</span>iconv<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mv"><span class="kw2">mv</span></a> ~<span class="sy0">/</span>tmp<span class="sy0">/</span>iconv <span class="st0">&quot;$1&quot;</span>
  </div>
  <div class='caption'>/.gnome2/nautilus-scripts/ISO to UTF</div>
  </div>
</p>

<p>
  Maintenant si vous tenez à convertir un lot de fichier, cela peut être fait ainsi :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw1">for</span> fichier <span class="kw1">in</span> $<span class="br0">&#40;</span><a target="blank" href="http://pwet.fr/man/linux/commandes/find"><span class="kw2">find</span></a> -type f . -name <span class="st0">&quot;*.java&quot;</span><span class="br0">&#41;</span> <span class="kw1">do</span> iconv --from-<span class="re2">code=</span>ISO<span class="nu0">-8859</span><span class="nu0">-1</span> --to-<span class="re2">code=</span>UTF<span class="nu0">-8</span> <span class="re1">$fichier</span> -c <span class="sy0">&gt;&gt;</span> ~<span class="sy0">/</span>tmp<span class="sy0">/</span>iconv <a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> <span class="re1">$fichier</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/mv"><span class="kw2">mv</span></a> ~<span class="sy0">/</span>tmp<span class="sy0">/</span>iconv <span class="re1">$fichier</span> <span class="kw1">done</span>
  </div>
  
  </div>
</p>


	<a name='chapter_4'></a>
  <h2>Conclusion</h2>
	
<p>
  Avec ces deux trois astuces, vous devriez couvrir l'ensemble des cas de figures permettant d'importer chez vous des fichiers non-ISO ou de convertir en UTF des fichiers qui devrait l'être. 
</p>
<p>
 Si l'impact UTF/ISO est assez faible pour un utilisateur standard, il est beaucoup plus critique s'agissant par exemple d'un développeur. Dans ce cas, l'UTF devient un encodage commun à tous, quel que soit le pays ou la plateforme utilisée. Et c'est encore plus vrai dans le monde open source.  
</p>    ]]></content>
  </entry>
</feed>
