Jekyll2020-06-20T11:26:48+00:00https://rozaxe.github.io/feed.xmlλCool articles on game programming, cooking and lifestyle !rozaxeS.FA.RE - #42020-06-20T00:00:00+00:002020-06-20T00:00:00+00:00https://rozaxe.github.io/2020/06/20/sfare-4<p>Bon, vous vous souvenez le mois dernier quand je vous disiez que “je [suis] satisfait d’avoir [choisi] React” pour mon jeu ? Et bien cela n’aura pas duré longtemps 😅</p>
<p>Le problème principal ? Les performances…</p>
<p>Dans mon esprit S.FA.RE se veut un peu comme <a href="https://www.factorio.com/">Factorio</a> ou comme <a href="https://playstarbound.com/">Starbound</a>, c’est à dire, beaucoup (beaucoup) d’entités et de flux à gérer en simultané.</p>
<p>Malheureusement, en faisant des tests de performance, en ayant “seulement” 1000 fermes, le jeu tourne entre 10 et 30 FPS sur mon ordi gaming… Injouable.</p>
<p>Autant dire que j’ai peur d’atteindre une limite “technique” avant d’atteindre une limite “artistique”.</p>
<p>Ainsi commence une grosse refonte du jeu. À priori je vais partir sur du C++, histoire d’être vraiment large niveau performance.</p>
<hr />
<p>À part cela, j’ai amélioré mon blog !</p>
<p>Première grande nouvelle, l’introduction d’une section <strong>commentaires</strong> ! 🎉</p>
<p>Celle-ci repose sur <strong><a href="https://utteranc.es/">Utterances</a></strong> 🔮 et nécéssite donc un compte GitHub pour commenter. Mais bon, je suis sûr que toi, lecteur, tu es aussi un développeur et que tu as un compte GitHub 😉</p>
<p>Deuxième (et dernière) grande nouvelle, l’ajout d’un <a href="/feed.xml"><strong>flux RSS</strong></a> en haut à droite pour ne plus manquer mes futurs posts ⭐️</p>
<p>Sur ce, bonne semaine !</p>rozaxeBon, vous vous souvenez le mois dernier quand je vous disiez que “je [suis] satisfait d’avoir [choisi] React” pour mon jeu ? Et bien cela n’aura pas duré longtemps 😅Les montécaos de la dèche2020-06-17T00:00:00+00:002020-06-17T00:00:00+00:00https://rozaxe.github.io/2020/06/17/montecaos<p>C’était un jour de confinement, le huitième, le dix-septième ou le soixante-dizième ? Je ne sais plus, je ne comptais plus.</p>
<p>Je ne me souvenais plus de l’odeur du beurre frais, du goût d’une pomme bien justeuse ou même de la saveur du chocolat !… Non en vrais j’avais peut être plus de papier-toillettes mais du chocolat, ça y en avait plus que prévus 😆</p>
<p>Ainsi, voici ma recette des montécaos, basé uniquement sur des produits non périssables !</p>
<hr />
<p>Pour une dizaine de montécaos :</p>
<ul>
<li>200 g de farine ;</li>
<li>10 cl d’huile (type isio 4) ;</li>
<li>50 g de sucre.</li>
</ul>
<p>Pour les étapes :</p>
<ol>
<li>mélanger l’ensemble pour former une pâte lisse ;</li>
<li>former des petites boules (une dizaine normalement) ;</li>
<li>enfourner pour 20 minutes à 160°C.</li>
</ol>
<blockquote>
<p>🌟 Vous pouvez aussi les parfumer avec une once de jus de citron ou autre !</p>
</blockquote>
<p>En fin de cuisson s’ils ne paraissent pas trop solide c’est normal, ils vont durcir en refroidissant.</p>
<p><img src="/assets/images/montecaos.jpg" alt="Montécaos" />
<em>Des montécaos tout chauds (avec option chocolat !)</em></p>
<p>Et oui c’est déjà finit ! C’est extrêment simple et rapide à faire. Je sais que quand j’ai un passage à vide, je fais des montécaos et ça va beaucoup mieux ;)</p>
<p>À plush !</p>rozaxeC’était un jour de confinement, le huitième, le dix-septième ou le soixante-dizième ? Je ne sais plus, je ne comptais plus.S.FA.RE - #32020-05-23T00:00:00+00:002020-05-23T00:00:00+00:00https://rozaxe.github.io/2020/05/23/sfare-3<p>Ahhh les vacances, que c’est agréable. À tel point que j’ai très peu avancé en deux semaines 😆</p>
<p>J’ai tout de même réussi à implémenter une ébauche de restaurant !</p>
<p><img src="/assets/images/sfare-3.png" alt="Clients" />
<em>Des aventuriers attendant leur commande</em></p>
<p>Ici nous pouvons voir deux aventuriers ayant commandé chacun une tarte aux pommes. Une table est toujours vide, mais pour combien de temps ?</p>
<p>Sur ce, bonne semaine !</p>rozaxeAhhh les vacances, que c’est agréable. À tel point que j’ai très peu avancé en deux semaines 😆S.FA.RE - #22020-05-09T00:00:00+00:002020-05-09T00:00:00+00:00https://rozaxe.github.io/2020/05/09/sfare-2<p>Pour cette seconde édition, beaucoup de remaniement de code !</p>
<p>Pour me permettre de développer au mieux le jeu, j’ai pensé à une architecture comme suit :</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">game</code> contiendra l’ensemble du code spécifique à SFARE
<ul>
<li><code class="language-plaintext highlighter-rouge">programming</code> contiendra les services, les mécaniques et les flux du jeu.</li>
<li><code class="language-plaintext highlighter-rouge">art</code> contiendra les vues du jeu. Chaque vue sera responsable d’afficher un ou plusieurs flux et de faire appel aux différents services.</li>
<li><code class="language-plaintext highlighter-rouge">design</code> contiendra l’ensemble des valeurs du jeu. Là où le dossier programmation contiendra le code pour décrire ce qu’est un <code class="language-plaintext highlighter-rouge">Plat</code>, le dossier design contiendra la liste des plats <code class="language-plaintext highlighter-rouge">[Tarte aux pommes, Poulet curry coco, Milkshake, ...]</code></li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">lib</code> contiendra tous mes algorithmes et autres fonctions pures qui ne sont pas spécifiques à SFARE et qui pourrait faire l’objet de paquets tiers ;</li>
<li><code class="language-plaintext highlighter-rouge">ui</code> contiendra mon système de conception graphique “comme au bon vieux temps des terminaux”. Ce sera ma collection de composants graphiques : bouton, champ de saisie, modal, carte, etc.</li>
</ul>
<p>J’ai aussi pu mettre en place Electron ! Désormais, SFARE se lance enfin comme il devrait se lancer, dans une fenêtre dédier ! (Et non plus dans un pauvre onglet perdu sur Firefox)</p>
<p><img src="/assets/images/sfare-2.png" alt="SFARE in Electron" />
<em>La fenêtre de jeu</em></p>
<p>Sur ce, bonne semaine !</p>rozaxePour cette seconde édition, beaucoup de remaniement de code !S.FA.RE - #12020-05-02T00:00:00+00:002020-05-02T00:00:00+00:00https://rozaxe.github.io/2020/05/02/sfare-1<p>Pour cette première édition de la découverte du développement interne de <em>Space Farming Restaurant</em>, j’ai une grande nouvelle à vous annoncer : Nous pouvons préparer des tartes à la pomme ! 😋🥧</p>
<p><img src="/assets/images/sfare-1.gif" alt="Apple pie making" />
<em>Miam miam</em></p>
<h2 id="détails-techniques">Détails techniques</h2>
<p>Ce n’était pas une mince affaire pour en arriver là !</p>
<p>La toute première version utilisait l’outil <a href="https://svelte.dev/">Svelte</a>, le jeu était très réactif et les fonctionnalités faciles à implémenter. Cependant, son écosystème étant encore très jeune, il n’y avait pas de support dans mon IDE (WebStorm) ni de support bien ficelé pour TypeScript. J’avais peur de cumuler une dette technique extrêmement vite.</p>
<p>J’ai donc décidé de changer d’outil et d’utiliser celui que je connaissais le mieux, <a href="https://reactjs.org/">React</a>. Le support TypeScript est natif et mon IDE le comprend à merveille.</p>
<p>Cependant, pour atteindre une réactivité “à la Svelte” je ne voulais pas utiliser Redux, les actions, reducers, selectors, thunks et je ne sais quoi d’autre, non merci.</p>
<p>À la place j’utilise <a href="https://rxjs.dev/">RxJS</a> sous forme de services pour gérer mes flux tels que l’inventaire et l’état des machines.</p>
<p>Et je dois dire, cela fonctionne à merveille ! Je touche du bois pour que cela reste le cas avec des centaines d’entités de jeu à gérer 😆</p>
<p>Pour conclure, suis-je satisfait d’avoir changé Svelte pour React ? Pour l’instant oui, mon code est beaucoup plus clair et bien organisé.</p>
<p>Sur ce, je retourne à mes fourneaux, bonne semaine !</p>rozaxePour cette première édition de la découverte du développement interne de Space Farming Restaurant, j’ai une grande nouvelle à vous annoncer : Nous pouvons préparer des tartes à la pomme ! 😋🥧Space Farming Restaurant2020-03-26T00:00:00+00:002020-03-26T00:00:00+00:00https://rozaxe.github.io/2020/03/26/space-farming-restaurant<p>En ces jours de confinement, alors que les bars, les musées et autres lieux de divertissements sont fermés, que les médias n’ont qu’un mot à la bouche, que nous sommes cloitrés (bien au chaud) chez nous, comment laisser notre esprit s’évader un petit peu ?</p>
<p>Personnellement, j’ai cette idée qui trotte depuis longtemps dans ma tête. Celle d’un endroit où je pourrais étaler mes talents de cuisinier, où les produits frais proviendraient de ma ferme auto-suffisante, où la découverte de l’inconnu serait à portée de main.</p>
<p>Plutôt que d’attendre patiemment que ce doux rêve se réalise, pourquoi ne pas prendre en main ce rêve et commencer à le réaliser ?</p>
<p>Alors non, je ne prévois pas (encore) d’acheter un petit lopin de terre dans la Creuse, d’y construire une micro-maison et de commencer un potager en permaculture.</p>
<p>Mais plutôt de simuler tous ces éléments et permettre à chacun de vivre ce petit bout de rêve.</p>
<p>C’est pourquoi j’ai commencé le développement de “<strong>Space Farming Restaurant</strong>”.</p>
<p>Pour ce jeu, j’ai comme vision de permettre au joueur de gérer son propre restaurant subspatial auto-suffisant.</p>
<p>Le concept est simple <strong>faire pousser ses propres tomates, récolter les pommes de son pommier, moudre son blé, mijoter de bons petits plats et nourrir les aventuriers et aventurières d’outre-espace venu de loin se reposer dans son comptoir</strong>.</p>
<p>Un rémède efficace à l’ambiance morose de cette période.</p>
<p>🚀🍓🥐</p>rozaxeEn ces jours de confinement, alors que les bars, les musées et autres lieux de divertissements sont fermés, que les médias n’ont qu’un mot à la bouche, que nous sommes cloitrés (bien au chaud) chez nous, comment laisser notre esprit s’évader un petit peu ?Les sablés fromage du confinement2020-03-20T00:00:00+00:002020-03-20T00:00:00+00:00https://rozaxe.github.io/2020/03/20/sable-fromage-confinement<p>Jour 4, mes réserves en produits frais s’amenuisent, l’idée d’ouvrir encore une boite de conserve me donne des hauts le cœur, l’envie de cuisiner se fait ressentir.</p>
<p>Bref, sans faire ma diva, je commence à ressentir le besoin de préparer de bons petits plats frais.</p>
<p>À la troisième fouille consécutive de mon frigo, j’ai remarqué qu’il me restait un peu de beurre végétal et un pauvre bout de fromage. Mon esprit a tressaillé, en rajoutant un peu de farine, j’allais pouvoir faire des sablés au fromage !</p>
<p>J’étais sauvé.</p>
<hr />
<p>Pour cette recette :</p>
<ul>
<li>300 g de farine ;</li>
<li>200 g de beurre végétal ;</li>
<li>100 g de fromage ;</li>
<li>une cuillère à café d’herbes de Provence ;</li>
<li>une pincée de sel et de poivre.</li>
</ul>
<p>Pour les étapes :</p>
<ol>
<li>mélanger l’ensemble pour former une pâte lisse ;</li>
<li>réserver au frigo pendant 15 minutes ;</li>
<li>étaler la pâte sur un plan fariné ;</li>
<li>découper à l’emporte-pièce les sablés ;</li>
<li>enfourner pour 45 minutes à 150°C.</li>
</ol>
<p><img src="/assets/images/sable.jpg" alt="Sablés au fromage" />
<em>Les sablés sont prêt !</em></p>
<p>Bon confinement et bonne dégustation !</p>rozaxeJour 4, mes réserves en produits frais s’amenuisent, l’idée d’ouvrir encore une boite de conserve me donne des hauts le cœur, l’envie de cuisiner se fait ressentir.Encodage des caractères2017-08-03T00:00:00+00:002017-08-03T00:00:00+00:00https://rozaxe.github.io/2017/08/03/encodage-des-caracteres<p>Nous pourrions résumer l’écriture à une suite de symboles. Ces formes, nommées “caractères”, regroupent tous les alphabets du monde, les chiffres, la ponctuation et même les emojis 😄.</p>
<p>Dans cet article, nous allons nous intéresser à comment <strong>sont représentés les caractères dans l’informatique</strong>. Comme toutes données informatisées, les caractères sont représentés par une suite de zéros et de uns et affichés sous forme graphique pour que nous ne nous y perdions pas. Cependant, la façon d’ordonner les zéros et les uns dépend de l’encodage utilisé.</p>
<p>Fait surprenant, l’encodage n’est pas présent en tant que métadonnée d’un fichier (comme l’est le titre, ou la date de création). Le seul moyen de le connaître est… <strong>de le deviner</strong> ! Oui vous avez bien lu, quelque chose qui devrait être basique est en fait un vrai plat de spaghettis où chacun utilise des normes différentes. Nous allons démêler tout cela ci-dessous.</p>
<p>Pour cela, nous devons nous équiper d’un terminal capable de comprendre plusieurs encodages. Sous macOS, l’application native Terminal permet de le faire. Sinon, la commande *nix <code class="language-plaintext highlighter-rouge">iconv</code> permet de traduire d’un encodage à un autre.</p>
<h1 id="au-début-lascii">Au début, l’ASCII</h1>
<p>Au début des années soixante, les caractères étaient codés sur <strong>sept bits</strong> ! Nous pouvions donc représenter <code class="language-plaintext highlighter-rouge">2^7 = 128</code> caractères différents. L’informatique étant principalement en anglais, il y avait largement la place pour y représenter tout l’alphabet latin en majuscule et en minuscule, plus les chiffres et autres caractères de ponctuation.</p>
<p><img src="/assets/images/ascii-table.png" alt="Table Ascii" />
<em>Les cent vingt-huit caractères de la table ASCII.</em></p>
<p>Le terme officiel pour décrire cet encodage est <code class="language-plaintext highlighter-rouge">us-ascii</code> ou encore <code class="language-plaintext highlighter-rouge">iso646</code>. Cet encodage est simple, chaque <strong>caractère</strong> tient sur <strong>un octet</strong>. Parcourir un fichier est aisé, chaque octet lu peut être représenté graphiquement !</p>
<p>Créons une séquence ASCII à la main :</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># terminal en us-ascii</span>
<span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\x61\x62\x63'</span> <span class="o">></span> ascii
<span class="nv">$ </span><span class="nb">cat </span>ascii
abc
</code></pre></div></div>
<p>Seulement voilà, cet alphabet n’en est qu’un parmi trois milles autres<sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup>. Il a donc fallu trouver un moyen de pouvoir représenter ces autres alphabets.</p>
<h2 id="lascii-étendu">L’ASCII étendu</h2>
<p>Avant toute chose, l’ASCII étendu n’existe pas. C’est un regroupement de différents encodages basés sur le même principe.
L’ASCII se représente sur sept bits, mais un octet contient huit bits, après calcul, il reste un bit qui n’est pas utilisé ! Grâce à celui-ci, c’est cent vingt-huit nouveaux caractères qui peuvent être créés !</p>
<p>Je vous présente les encodages <code class="language-plaintext highlighter-rouge">iso-8859-1</code>, <code class="language-plaintext highlighter-rouge">iso-8859–2</code>, <code class="language-plaintext highlighter-rouge">iso-8859-3</code>, <code class="language-plaintext highlighter-rouge">iso-8859-4</code>, <code class="language-plaintext highlighter-rouge">iso-8859-5</code>, <code class="language-plaintext highlighter-rouge">iso-8859-6</code>, <code class="language-plaintext highlighter-rouge">iso-8859-7</code>, <code class="language-plaintext highlighter-rouge">iso-8859-8</code>, <code class="language-plaintext highlighter-rouge">iso-8859-9</code>, <code class="language-plaintext highlighter-rouge">iso-8859-10</code>, <code class="language-plaintext highlighter-rouge">iso-8859-11</code>, <code class="language-plaintext highlighter-rouge">iso-8859-12</code>, <code class="language-plaintext highlighter-rouge">iso-8859-13</code>, <code class="language-plaintext highlighter-rouge">iso-8859-14</code>, <code class="language-plaintext highlighter-rouge">iso-8859-15</code>. Ça en fait !</p>
<p>Le principe est de <strong>garder</strong> les caractères ASCII et d’<strong>ajouter</strong> les caractères manquant dans les cent vingt huit restants. Chaque norme correspond donc à une <strong>combinaison d’alphabets</strong>. Par exemple, l’encodage <code class="language-plaintext highlighter-rouge">iso-8859–7</code> contient les caractères latins et les caractères grecs. L’encodage <code class="language-plaintext highlighter-rouge">iso-8859-15</code> contient les caractères latins et les caractères manquants des langues européennes.</p>
<p>Ceci implique qu’un <strong>même fichier</strong> peut être <strong>lu différemment</strong> selon l’encodage utilisé pour décoder, exemple :</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\x34\x32\xa5'</span> <span class="o">></span> ambiguous
</code></pre></div></div>
<p>Je configure mon terminal pour afficher les caractères en <code class="language-plaintext highlighter-rouge">iso-8859-1</code> et j’obtiens :</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">cat </span>ambiguous
42¥
</code></pre></div></div>
<p>Je le configure maintenant en <code class="language-plaintext highlighter-rouge">iso-8859-7</code> :</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">cat </span>ambiguous
42₯
</code></pre></div></div>
<p>Ainsi, selon l’encodage je peux parler d’un prix en devise japonaise ou en devise grecque (avant l’euro) et impossible de trancher si je n’ai aucune idée duquel utiliser.</p>
<p>Outre le fait de devoir savoir quel encodage utiliser, il n’y a tout simplement pas la place pour représenter certains alphabets, comme par exemple, les langues utilisant des idéogrammes.</p>
<h1 id="lunicode-à-la-rescousse">L’Unicode à la rescousse</h1>
<p>Dans les années quatre-vingt-dix apparaît le standard <strong>Unicode</strong>, celui-ci cherche à <strong>rassembler tous</strong> les caractères dans une <strong>seule norme</strong>. Il contient quelques cent vingt-huit mille caractères. Le principe est simple, <strong>un nombre correspond à un symbole</strong>, point.</p>
<p>Ces nombres, appelés <strong>point de code</strong> sont représentés en hexadécimal. Ainsi, le symbole latin <code class="language-plaintext highlighter-rouge">a</code> a pour point de code <code class="language-plaintext highlighter-rouge">U+0061</code> et le symbole grec <code class="language-plaintext highlighter-rouge">Ω</code> a pour point de code <code class="language-plaintext highlighter-rouge">U+03A9</code>. Ceux-ci sont agencés en <strong>plans</strong>, les plus utilisés étant le <em>“plan 0 : Basic Multilingual Plane”</em> et le <em>“plan 1 : Supplementary Multilingual Plane”</em>.</p>
<p>Maintenant, comment encoder ces symboles qui ne peuvent tenir sur un octet ? Faisons au plus simple : prenons notre symbole, trouvons son point de code, écrivons-le sur autant d’octets que nécessaire, et recommençons avec le symbole suivant.</p>
<p>Je vous propose la séquence d’octets suivante <code class="language-plaintext highlighter-rouge">61 62 63</code>, pouvez-vous me reconstituer la phrase ?</p>
<p>Bien sûr que non ! Cette suite pourrait correspondre à bien des choses :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>abc
慢c
a扣
</code></pre></div></div>
<p>Il faut trouver un moyen de représenter n’importe quel caractère sans ambiguïté !</p>
<h2 id="utf-8-utf-16-et-utf-32">UTF-8, UTF-16 et UTF-32</h2>
<p>Avant toute chose, sachez que ces trois encodages permettent de représenter l’<strong>ensemble</strong> des caractères Unicode. (Donc ne faites pas mon erreur de penser que l’UTF-32 peut représenter plus de caractère que l’UTF-16 qui lui-même peut représenter plus de caractères que l’UTF-8 😅)</p>
<p>La “seule” différence, est la façon d’agencer les zéros et les uns.</p>
<h3 id="utf-32">UTF-32</h3>
<p>Le plus simple des trois, l’UTF-32 représente chaque caractère sur quatre octets ! À la manière d’un fichier ASCII, ici nous lisons le fichier quatre octets par quatre octets.</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># terminal en utf32</span>
<span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\x00\x00\x00\x61\x00\x00\x62\x63'</span> <span class="o">></span> utf32
<span class="nv">$ </span><span class="nb">cat </span>utf32
a扣
<span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\x00\x00\x00\x61\x00\x00\x00\x62\x00\x00\x00\x63'</span> <span class="o">></span> utf32b
<span class="nv">$ </span><span class="nb">cat </span>utf32b
abc
</code></pre></div></div>
<p>Aucune ambiguïté possible. Seulement voilà, les caractères qui auparavant tenaient sur un octet, en occupent quatre maintenant, une énorme perte de place !</p>
<h3 id="utf-16">UTF-16</h3>
<p>Cet encodage permet de faire tenir tout caractère sur un <strong>codet</strong> (deux octets) ou un <strong>demi-codet</strong> (deux fois deux octets) (oui ce n’est pas logique).</p>
<p>Les caractères du plan zéro sont représenté sur un codet. Pour les caractères de plan supérieur, nous les représentons sur un demi-codet et devons utiliser les <strong>demi-zones d’indirection</strong>. Ces zones regroupent tous les codets dont les cinq bits de poids fort sont <code class="language-plaintext highlighter-rouge">11011</code>.</p>
<p>Pour encoder les caractères sur un demi-codet nous utilisons la procédure suivante :</p>
<ol>
<li>soustraire au point de code la valeur <code class="language-plaintext highlighter-rouge">0x10000</code> ;</li>
<li>prendre les dix bits de poids fort et y pré-fixer <code class="language-plaintext highlighter-rouge">1101 10</code> ;</li>
<li>prendre les dix bits de poids faible et y pré-fixer <code class="language-plaintext highlighter-rouge">1101 11</code>.</li>
</ol>
<p>Exemple pour <code class="language-plaintext highlighter-rouge">😀</code> :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0000 1111 0110 0000 0000 # 0x1F600 - 0x10000
fort = 1101 1000 0011 1101 # 1101 10 + 0000 1111 01
faible = 1101 1110 0000 0000 # 1101 11 + 10 0000 0000
1101 1000 0011 1101 1101 1110 0000 0000 # demi-codet
D8 3D DE 00 # en hexadécimal
</code></pre></div></div>
<p>Et vérifions avec :</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># terminal en utf16</span>
<span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\xD8\x3D\xDE\x00'</span> <span class="o">></span> utf16
<span class="nv">$ </span><span class="nb">cat </span>utf16
😀
</code></pre></div></div>
<p>Simple n’est-ce pas ? Et si nous pouvions faire encore mieux ?</p>
<h3 id="utf-8">UTF-8</h3>
<p>Ce dernier encodage permet de représenter tous les caractères sur un à quatre octets :</p>
<ul>
<li>de <code class="language-plaintext highlighter-rouge">U+0000</code> à <code class="language-plaintext highlighter-rouge">U+007F</code> il faut <strong>un</strong> octet ;</li>
<li>de <code class="language-plaintext highlighter-rouge">U+0080</code> à <code class="language-plaintext highlighter-rouge">U+07FF</code> il faut <strong>deux</strong> octets ;</li>
<li>de <code class="language-plaintext highlighter-rouge">U+0800</code> à <code class="language-plaintext highlighter-rouge">U+FFFF</code> il faut <strong>trois</strong> octets ;</li>
<li>à partir de <code class="language-plaintext highlighter-rouge">U+10000</code> il faut <strong>quatre</strong> octets.</li>
</ul>
<p>Pour l’encodage, nous nous référons à cette liste<sup id="fnref:2"><a href="#fn:2" class="footnote">2</a></sup> :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0x00000000 - 0x0000007F:
0xxxxxxx
0x00000080 - 0x000007FF:
110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF:
1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF:
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
</code></pre></div></div>
<p>Il nous suffit de substituer les <code class="language-plaintext highlighter-rouge">x</code> par le code binaire, en commençant par les bits de poids faible.</p>
<p>Reprenons notre caractère <code class="language-plaintext highlighter-rouge">😀</code>. Pour l’encoder en UTF-8 nous faisons :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> 00 011111 011000 000000 # point de code en binaire
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
11110x00 10011111 10011000 10000000 # substitution
11110000 10011111 10011000 10000000 # tous les x restants en 0
F0 9F 98 80 # en hexadécimal
</code></pre></div></div>
<p>Vérifions avec :</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># terminal en utf8</span>
<span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\xF0\x9F\x98\x80'</span> <span class="o">></span> utf8
<span class="nv">$ </span><span class="nb">cat </span>utf8
😀
</code></pre></div></div>
<p>Encore plus simple vous ne trouvez pas ? Cet encodage a plusieurs avantages. Il gaspille moins de place que les deux autres et il est compatible avec la table ASCII.</p>
<h1 id="détection-de-lencodage">Détection de l’encodage</h1>
<p>Jusqu’à présent nous devions préciser quel encodage utiliser pour afficher les séquences de textes. Mais, en avons-nous vraiment besoin ?</p>
<p>Utilisons la commande *nix <code class="language-plaintext highlighter-rouge">file</code> qui permet de détecter l’encodage d’un fichier.</p>
<p>Testons sur nos séquences précédentes.</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>file ascii
ASCII text
<span class="nv">$ </span>file utf32
data
<span class="nv">$ </span>file utf16
ISO-8859 text
<span class="nv">$ </span>file utf8
UTF-8 Unicode text
</code></pre></div></div>
<p>Seulement deux encodages sont reconnus 😱 La divination ne marche pas toujours. Pour être sûr, nous avons systématiquement besoin de spécifier l’encodage. Ceci n’est vraiment pas ergonomique.</p>
<p>Existe-t-il un moyen de spécifier cet encodage qui soit transparent à l’utilisateur ?</p>
<h2 id="lindicateur-dordre-des-octets">L’indicateur d’ordre des octets</h2>
<p>Cet indicateur, appelé <em>BOM</em> en anglais, est une séquence de caractères placée en tête de fichier qui permet de spécifier l’encodage. Il s’agit d’un nombre magique. Il est présent dans le corps du fichier, mais les logiciels ne doivent pas le gérer en tant que caractère, mais en tant qu’information (à la manière d’une métadonnée).</p>
<p>En voici une liste (non-exhaustive) :</p>
<ul>
<li>UTF-8 : <code class="language-plaintext highlighter-rouge">EF BB BF</code> ;</li>
<li>UTF-16 : <code class="language-plaintext highlighter-rouge">FE FF</code> ;</li>
<li>UTF-32 : <code class="language-plaintext highlighter-rouge">00 00 FE FF</code>.</li>
</ul>
<p>Testons cela.</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\x00\x00\xFE\xFF\x00\x00\x00\x61\x00\x00\x62\x63'</span> <span class="o">></span> utf32
<span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\xFE\xFF\xD8\x3D\xDE\x00'</span> <span class="o">></span> utf16
<span class="nv">$ </span><span class="nb">echo</span> <span class="nt">-ne</span> <span class="s1">'\xEF\xBB\xBF\xF0\x9F\x98\x80'</span> <span class="o">></span> utf8
</code></pre></div></div>
<p>Vérifions avec :</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>file utf32
UTF-32 Unicode text
<span class="nv">$ </span>file utf16
UTF-16 Unicode text
<span class="nv">$ </span>file utf8
UTF-8 Unicode text <span class="o">(</span>with BOM<span class="o">)</span>
</code></pre></div></div>
<p>Tout fonctionne !</p>
<p>Cependant, comment faire pour traiter des flux de données ? Et bien il n’y a pas de solution miracle. Il faut encore spécifier manuellement l’encodage.</p>
<h1 id="au-final">Au final</h1>
<p>Quel encodage devons-nous utiliser ?</p>
<p><strong>Et bien il n’y a pas de réponse.</strong></p>
<p>Par exemple les langages Java et JavaScript utilisent de l’UTF-16 pour les chaînes de caractères, le langage Rust de l’UTF-8. Microsoft utilise de l’UTF-32 avec indicateur. Les systèmes *nix utilisent de l’UTF-8 et de l’UTF-32. Le web repose sur l’UTF-8.</p>
<p>Aujourd’hui, le monde informatique tend à privilégier l’UTF-8. À vous de voir ce qui convient le mieux pour vos besoins.</p>
<hr />
<p>Références :</p>
<ul>
<li><a href="http://hapax.qc.ca/conversion.fr.html">Convertisseur de code Unicode</a></li>
<li><a href="http://www.unicode.org/faq/utf_bom.html">UTF-8, UTF-16, UTF-32 & BOM</a></li>
<li><a href="https://stackoverflow.com/questions/6240055/manually-converting-unicode-codepoints-into-utf-8-and-utf-16">Manually converting unicode codepoints into UTF-8 and UTF-16</a></li>
<li><a href="https://www.iana.org/assignments/character-sets/character-sets.xhtml">Character Sets</a></li>
</ul>
<hr />
<div class="footnotes">
<ol>
<li id="fn:1">
<p><a href="https://www.ethnologue.com/enterprise-faq/how-many-languages-world-are-unwritten-0">How many languages in the world are unwritten</a> <a href="#fnref:1" class="reversefootnote">↩</a></p>
</li>
<li id="fn:2">
<p><a href="https://linux.die.net/man/7/utf-8">utf-8 - Linux man page</a> <a href="#fnref:2" class="reversefootnote">↩</a></p>
</li>
</ol>
</div>rozaxeNous pourrions résumer l’écriture à une suite de symboles. Ces formes, nommées “caractères”, regroupent tous les alphabets du monde, les chiffres, la ponctuation et même les emojis 😄.