Damien Clauzel - Mot-clé - UTF-82024-03-27T11:37:53+01:00Damien Clauzelurn:md5:6728c0058bb2c4b2870d8dbd71b50f9eDotclearProblème d'encodage avec Java sous MacOS X Léopardurn:md5:b9047f870fe3865c803861e5a05811012008-09-03T15:51:00+02:002016-01-06T18:21:53+01:00Damien ClauzelInformatiqueencodageGNU-linuxJavaligne de commandeMacOSsysadminUTF-8 <p>Sous Léopard, la <a href="http://fr.wikipedia.org/wiki/Machine_virtuelle_Java" hreflang="fr">machine virtuelle java</a> (JVM) d'<a href="http://fr.wikipedia.org/wiki/Apple,_Inc." hreflang="fr">Apple</a> se lance par défaut avec l'encodage <a href="http://fr.wikipedia.org/wiki/MacRoman" hreflang="fr">MacRoman</a>. Si choix est compréhensible au vu de l'histoire des technologies d'Apple, il est toutefois de nos jours rendu obsolète avec le passage à l'<a href="http://fr.wikipedia.org/wiki/Unicode" hreflang="fr">unicode</a>. Pire, les développeurs et administrateurs systèmes s'attendent désormais à des outils fonctionnant en <a href="http://fr.wikipedia.org/wiki/UTF-8" hreflang="fr">UTF-8</a>, ce qui pose donc des problèmes d'intégration.</p>
<p>Pour les systèmes <a href="http://fr.wikipedia.org/wiki/GNU" hreflang="fr">GNU</a>/<a href="http://fr.wikipedia.org/wiki/Noyau_Linux" hreflang="fr">linux</a>, les différentes JVM travaillent avec l'encodage du système qui est désormais l'UTF-8. Mais la JVM d'Apple se comporte différemment, avec un réglage défini en interne.</p>
<p>Faisons quelques essais avec ce <a href="http://www.codingdiary.com/developers/developers/diary/javaapi/java/io/SampleCode/OutputStreamWritergetEncodingExampleCode.html" hreflang="en">jeu de test</a>.</p>
<p>Commençons avec GNU/linux :</p>
<pre class="brush: bash">$ uname -a
Linux liristpq.Univ-Lyon1.fr 2.6.27-2-generic #1 SMP Thu Aug 28 17:18:43 UTC 2008 x86_64 GNU/linux
$ java GetEncoding
Random bytes
encoding: UTF8
$ LC_ALL=ASCII java GetEncoding
Random bytes
encoding: ASCII</pre>
<p>Comme on peut le constater, l'utilisation de l'encodage est dynamique, avec par défaut celui du système.</p>
<p>Regardons maintenant ce que cela donne sur Léopard. Nous commençons par lancer la même commande que pour GNU/Linux, et ensuite nous affinerons manuellement l'encodage UTF-8 avec l'option <code>-Dfile.encoding=UTF-8</code> :</p>
<pre class="brush: bash">$ uname -a
Darwin arda.local 9.4.0 Darwin Kernel Version 9.4.0: Mon Jun 9 19:30:53 PDT 2008; root:xnu-1228.5.20~1/RELEASE_I386 i386 i386 iMac6,1 Darwin
$ java GetEncoding
Random bytes
encoding: MacRoman
$ java -Dfile.encoding=UTF-8 GetEncoding
Random bytes
encoding: UTF8
$ LC_ALL=ASCII java GetEncoding
Random bytes
encoding: MacRoman</pre>
<p>La différence est flagrante. La JVM d'Apple sous Léopard utilise par défaut l'encodage MacRoman et ne supporte pas la sélection par les locales, ce qui pose de réels problèmes d'interopérabilité.</p>
<p>Une solution simple est d'appeler systématiquement la JVM en spécifiant l'encodage UTF-8, mais elle n'est pas idéal.</p>https://damien.clauzel.eu/post/2008/09/03/Probleme-d-encodage-avec-Java-sous-MacOS#comment-formhttps://damien.clauzel.eu/feed/atom/comments/25