Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2023-01-20T13:27:12+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484882023-01-20T13:27:12+01:00Taurre/@Taurrehttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248488<figure><blockquote>
<ul>
<li>La chaîne récupérée via le terminal qui est d’abord convertie vers une chaîne de caractères larges à l’aide de la fonction <code>mbstowcs()</code>, puis convertie vers une chaîne de caractères à l’aide de la fonction <code>wcstombs()</code>. Vu que ton terminal utilise l’encodage Windows-1252, le nombre de <em>bytes</em> est correct : en Windows-1252 <code>é</code> est sur un <em>byte</em> et non deux. Par contre le résultat n’est pas bon et je ne vois pas pourquoi de prime abord… Est-ce que tu sais me donner le résultat du code ci-dessous pour la même entrée ?</li>
</ul>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248465">Taurre</a></figcaption></figure>
<p>Après quelques essais, j’ai en partie la réponse à ma question.</p>
<p>Avant de continuer, quelques éléments, parce que ce que je dis est probablement pas forcément clair :</p>
<ul>
<li>Le type <code>wchar_t</code> doit être capable de représenter tous les caractères de toutes les localisations supportées (ceci induit donc presque toujours plus qu’un <em>byte</em> puisque les localisations asiatiques sont supportées et ont trop de caractères pour pouvoir tout représenter avec 255 valeurs possibles).</li>
<li>Comme pour les chaînes de caractères littérales, l’encodage des chaînes de caractères larges littérales (préfixées par <code>L</code>) est déterminé par le compilateur. Il s’agit par exemple de l’UTF-32 sous Linux et de l’UTF-16 sous Windows. Il peut être modifié via l’option <code>-fwide-exec-charset</code> de GCC.</li>
<li>Lors de l’exécution du programme (donc hors chaînes littérales), les encodages utilisé lors d’une conversion entre caractères et caractères larges sont déterminés par la localisation. Dans le cas de la localisation <code>C</code>, celle par défaut, les caractères sont supposés avoir une valeur sur un <em>byte</em> (dit autrement, si on tente de convertir une chaîne encodée en UTF-8 avec la localisation <code>C</code>, chaque <em>byte</em> va être considéré comme représentant un caractère).</li>
</ul>
<p>Ceci étant dit, reprenons le tout :</p>
<ul>
<li>Comme l’as préciser <a href="/@dalfab" rel="nofollow" class="ping ping-link">@<span class="ping-username">dalfab</span></a>, par défaut la console Windows utilise l’encodage IBM 850. Quand tu entres <code>élégant</code> dans le terminal, tu reçois donc la suite <code>\x82\x6c\x82\x67\x61\x6e\x74</code> (tu as aussi un caractère de fin ligne <code>\n</code>, mais peu importe pour la suite). </li>
<li>L’appel à <code>setlocale()</code> modifie les encodages utilisés pour les conversions entre caractères et caractères larges. En l’occurrence, avec une localisation francophone sous Windows, les caractères larges seront encodés en UTF-16 et les caractères en Windows-1252.</li>
<li>L’appel à <code>mbstowcs()</code> va convertir la chaîne <code>élégant</code> en une chaînes de caractères larges. Vu l’appel à <code>setlocale()</code> elle considère que cette chaîne est encodée en Windows-1252 (et non en IMB 850). Tu obtiens alors ceci en UTF-16 : <code>\x20\x1a\x6c\x00\x20\x1a\x67\x00\x61\x00\x6e\x00\x74\x00</code>. En Windows-1252, le point de code <code>0x82</code> (qui est celui du <code>é</code> en IMB 850) correspond au caractère <code>‚</code> (portant le doux nom de « Guillemet-Virgule inférieur ») qui, en Unicode, a le point de code <code>0x201a</code>.</li>
<li>L’appel à <code>wcstombs()</code> va convertir la chaîne de caractères larges précédentes en une chaîne de caractères. On obtient donc à nouveau <code>\x82\x6c\x82\x67\x61\x6e\x74</code>.</li>
<li>Finalement on affiche la chaîne initiale et là, ça foire et je sais pas pourquoi. En fait, dès l’appel à <code>setlocale()</code>, l’affichage de la chaîne initialement lue ne fonctionne plus alors que si on récupère une autre chaîne en entrée, elle sera encodée de la même manière. J’ignore ce que fais <code>setlocale()</code> sous Windows dans ce cas ci, mais l’affichage n’est plus correct. En revanche les conversions entre caractères et caractères larges sont tout à fait correctes (si on omet le fait que l’encodage des caractères n’est pas celui utilisé par le terminal).</li>
</ul>
<p>La seule solution pour que cela fonctionne est, comme le propose <a href="/@dalfab" rel="nofollow" class="ping ping-link">@<span class="ping-username">dalfab</span></a>, c’est de faire appel à <code>chcp 1252</code>.</p>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484812023-01-19T15:18:33+01:00dalfab/@dalfabhttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248481<p>Salut,</p>
<p>Les jeux de caractères est un problème qu’un débutant devrait contourner, c’est loin d’être simple.</p>
<p>Tout d’abord on doit distinguer:</p>
<ol>
<li>le jeu de caractère utilisé quand on édite le code source.
Par exemple: si j’écris dans le code <code>char x[] = "à";</code> l’éditeur va écrire dans le fichier texte un octet qui correspond au '<strong>à</strong>' (mais peut-être plusieurs sont nécessaires p.e. en utf-8.)</li>
<li>le jeu de caractère utilisé par défaut dans les chaines de caractères du code. Correspond à l’encodage de tout ce qui était dans le code sous la forme <code>'.'</code> ou <code>"..."</code> sans préfixe.
par exemple: <code>"à"</code> est devenu une séquence d’octets terminée par un 0 qui dépend de l'<em>execution-charset</em> alors que <code>u8"à"</code> est garanti en utf-8.</li>
<li>le jeu de caractère utilisé par la console (ou si on écrit/lit un fichier, celui du fichier.)</li>
</ol>
<p>Sous Linux, on peut compter sur le fait que les 3 sont utf-8. Donc on ne devrait pas avoir de problème particulier. Sauf que en utf-8 dès les caractères accentués, un caractère nécessite plusieurs <code>char</code>, et ça peut perturber un débutant.</p>
<p>Sous Windows, pourquoi faire simple quand on peut faire compliqué:</p>
<ul>
<li>Le jeu de caractère utilisé dans les fichiers texte est très souvent windows-1252 en Europe.</li>
<li>Le jeu de caractère du code est variable. Par exemple Visual avait windows-1252 jusqu’à Visual2019, et serait en utf-8 depuis Visual2022.</li>
<li>La console Windows est par défaut en IBM-850 en Europe. On peut changer la page de code mais il semblerait que les modes UTF8 et UTF16 soient bancales.</li>
</ul>
<p>Tenter d’écrire un code qui s’adapte à ça dans tous les cas, est possible (du moins je le pense, mais ça ne fait que 40 ans que je fais du C et je ne m’y risquerais pas!) Il faut donc essayer de se ramener à un cas plus simple:</p>
<ul>
<li>n’utiliser que des caractères ASCII</li>
<li>ou passer sous Linux</li>
<li>ou, on peut forcer tout le monde à s’entendre pour avoir le même <em>charset</em>. Je pense que le plus simple avec Visual: supposer qu’il retrouve seul le <em>charset</em> du fichier source, utiliser l’option <code>/fexec-charset=windows-1252</code> et envoyer vers la console au début du programme la ligne de code <code>system("chcp 1252 > NULL");</code> comme ça tout le monde est en 1252.</li>
</ul>
<p>Tu as dû remarquer que je n’ai même pas cité le <code>setlocale()</code> du cours. Son rôle consiste à gérer certaines choses dont l’encodage des caractères du code lors d’échanges, c’est dans la partie que je propose de contourner. restons simple <img src="/static/smileys/svg/clin.svg" alt=";)" class="smiley"> </p>
<p>PS: j’ai utilisé plein de vocabulaires pour "jeu de caractères", "<em>charset</em>", "page de code", "encodage"; dis-toi que ça désigne la même chose.</p>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484652023-01-18T13:37:40+01:00Taurre/@Taurrehttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248465<p>Salut,</p>
<p>Certains éléments ont déjà été donnés, mais pour reprendre le tout, il faut distinguer deux choses :</p>
<ul>
<li>
<p>La chaîne littérale <code>"%zu multiplet(s) écrit(s) : %s\n"</code> dont l’encodage dépend du compilateur (sauf à la préfixer avec <code>u8</code> auquel cas ce sera de l’UTF-8). Le plus souvent ce sera de l’UTF-8 (c’est ce que font GCC et Clang par exemple). L’affichage dans le terminal est incorrect, parce que ton terminal n’attend pas de l’UTF-8. À vue de nez c’est du <a href="https://fr.wikipedia.org/wiki/Windows-1252">Windows-1252</a> (qui est identique au latin-1), en tous les cas ce qui est affiché correspond bien aux caractères avec les points de code <code>0xC3</code> (<code>Ã</code>) et <code>0xA9</code> (<code>©</code>), qui sont les deux <em>bytes</em> de <code>é</code> en UTF-8. Si tu utilises GCC, tu peux forcer l’usage de l’encodage Windows-1252 pour les chaînes littérales avec l’option <code>-fexec-charset=windows-1252</code>.</p>
</li>
<li>
<p>La chaîne récupérée via le terminal qui est d’abord convertie vers une chaîne de caractères larges à l’aide de la fonction <code>mbstowcs()</code>, puis convertie vers une chaîne de caractères à l’aide de la fonction <code>wcstombs()</code>. Vu que ton terminal utilise l’encodage Windows-1252, le nombre de <em>bytes</em> est correct : en Windows-1252 <code>é</code> est sur un <em>byte</em> et non deux. Par contre le résultat n’est pas bon et je ne vois pas pourquoi de prime abord… Est-ce que tu sais me donner le résultat du code ci-dessous pour la même entrée ?</p>
</li>
</ul>
<div class="hljs-code-div hljs-code-c"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span><span data-count="41"></span><span data-count="42"></span><span data-count="43"></span><span data-count="44"></span><span data-count="45"></span><span data-count="46"></span><span data-count="47"></span><span data-count="48"></span><span data-count="49"></span><span data-count="50"></span><span data-count="51"></span><span data-count="52"></span><span data-count="53"></span><span data-count="54"></span><span data-count="55"></span><span data-count="56"></span><span data-count="57"></span><span data-count="58"></span></div><pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><locale.h></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><stddef.h></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><stdio.h></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><stdlib.h></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><string.h></span></span>
<span class="hljs-function"><span class="hljs-keyword">void</span>
<span class="hljs-title">print_hex</span><span class="hljs-params">(<span class="hljs-keyword">char</span> *s, <span class="hljs-keyword">size_t</span> size)</span> </span>{
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">size_t</span> i = <span class="hljs-number">0</span>; i < size; i++) {
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"%02x "</span>, (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">char</span>)s[i]);
}
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"\n"</span>);
}
<span class="hljs-function"><span class="hljs-keyword">int</span>
<span class="hljs-title">main</span><span class="hljs-params">(<span class="hljs-keyword">void</span>)</span> </span>{
<span class="hljs-keyword">char</span> ligne[<span class="hljs-number">255</span>];
<span class="hljs-keyword">if</span> (fgets(ligne, <span class="hljs-keyword">sizeof</span> ligne, <span class="hljs-built_in">stdin</span>) == <span class="hljs-literal">NULL</span>) {
perror(<span class="hljs-string">"fgets"</span>);
<span class="hljs-keyword">return</span> EXIT_FAILURE;
}
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"Contenu de ligne : "</span>);
print_hex(ligne, <span class="hljs-built_in">strlen</span>(ligne));
<span class="hljs-keyword">char</span> *locale = setlocale(LC_CTYPE, <span class="hljs-string">""</span>);
<span class="hljs-keyword">if</span> (locale == <span class="hljs-literal">NULL</span>) {
perror(<span class="hljs-string">"setlocale"</span>);
<span class="hljs-keyword">return</span> EXIT_FAILURE;
}
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"Locale actuelle : %s.\n"</span>, locale);
<span class="hljs-keyword">wchar_t</span> ws[<span class="hljs-keyword">sizeof</span> ligne];
<span class="hljs-keyword">size_t</span> n = mbstowcs(ws, ligne, <span class="hljs-keyword">sizeof</span> ligne);
<span class="hljs-keyword">if</span> (n == (<span class="hljs-keyword">size_t</span>)<span class="hljs-number">-1</span>) {
perror(<span class="hljs-string">"mbstowcs"</span>);
<span class="hljs-keyword">return</span> EXIT_FAILURE;
}
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"mbstowcs a écrit %zu caractère(s) large(s).\n"</span>, n);
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"Contenu de ws : "</span>);
print_hex((<span class="hljs-keyword">char</span> *)ws, n * <span class="hljs-keyword">sizeof</span>(<span class="hljs-keyword">wchar_t</span>));
n = wcstombs(ligne, ws, <span class="hljs-keyword">sizeof</span> ligne);
<span class="hljs-keyword">if</span> (n == (<span class="hljs-keyword">size_t</span>)<span class="hljs-number">-1</span>) {
perror(<span class="hljs-string">"wcstombs"</span>);
<span class="hljs-keyword">return</span> EXIT_FAILURE;
}
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"wcstombs a écrit %zu caractère(s).\n"</span>, n);
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"Contenu de ligne : "</span>);
print_hex(ligne, n);
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre></div>
<p>Cela donne ceci chez moi, sous du Linux.</p>
<div class="hljs-code-div hljs-code-console"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span></div><pre><code class="language-console">élégant
Contenu de ligne : c3 a9 6c c3 a9 67 61 6e 74 0a
Locale actuelle : fr_BE.UTF-8.
mbstowcs a écrit 8 caractère(s) large(s).
Contenu de ws : e9 00 00 00 6c 00 00 00 e9 00 00 00 67 00 00 00 61 00 00 00 6e 00 00 00 74 00 00 00 0a 00 00 00
wcstombs a écrit 10 caractère(s).
Contenu de ligne : c3 a9 6c c3 a9 67 61 6e 74 0a
</code></pre></div>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484522023-01-17T17:52:07+01:00PierrotLeFou/@PierrotLeFouhttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248452<p>Le systeme Windows est assez vicieux en ce qui concerne les modes de conversion.</p>
<p>Voici mon petit test en Python:</p>
<div class="hljs-code-div hljs-code-python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span></div><pre><code class="hljs language-python"><span class="hljs-meta">>>> </span><span class="hljs-built_in">ord</span>(<span class="hljs-string">"é"</span>)
<span class="hljs-number">233</span>
<span class="hljs-meta">>>> </span><span class="hljs-built_in">chr</span>(<span class="hljs-number">233</span>)
<span class="hljs-string">'é'</span>
<span class="hljs-meta">>>> </span><span class="hljs-built_in">hex</span>(<span class="hljs-number">233</span>)
<span class="hljs-string">'0xe9'</span>
<span class="hljs-meta">>>> </span><span class="hljs-keyword">import</span> os
<span class="hljs-meta">>>> </span>os.system(<span class="hljs-string">"chcp"</span>)
Page de codes active : <span class="hljs-number">850</span>
<span class="hljs-number">0</span>
<span class="hljs-meta">>>> </span>os.system(<span class="hljs-string">"chcp 65001"</span>)
Page de codes active : <span class="hljs-number">65001</span>
<span class="hljs-number">0</span>
<span class="hljs-meta">>>> </span><span class="hljs-built_in">ord</span>(<span class="hljs-string">"é"</span>)
<span class="hljs-number">233</span>
<span class="hljs-meta">>>> </span>
</code></pre></div>
<p>Le code 65001 correspond au UTF-8.</p>
<p>Tout se passe comme si on ramenait tout en Latin-1 …</p>
<p>Je n’étais pas satisfait de mon test. Alors j’ai essayé ceci:</p>
<div class="hljs-code-div hljs-code-c"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span></div><pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><stdio.h></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><string.h></span></span>
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">(<span class="hljs-keyword">void</span>)</span> </span>{
<span class="hljs-keyword">char</span> <span class="hljs-built_in">string</span>[<span class="hljs-number">20</span>];
fgets(<span class="hljs-built_in">string</span>, <span class="hljs-number">20</span>, <span class="hljs-built_in">stdin</span>);
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"'%s'\n"</span>, <span class="hljs-built_in">string</span>);
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"l=%lld\n"</span>, (<span class="hljs-keyword">size_t</span>)<span class="hljs-built_in">strlen</span>(<span class="hljs-built_in">string</span>)); <span class="hljs-comment">// Je compile avec -Wall et -Wextra</span>
}
</code></pre></div>
<p>Ce qui donne ceci en passant du code850 à 65001</p>
<div class="hljs-code-div hljs-code-c"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span></div><pre><code class="hljs language-c">>ac
clés
<span class="hljs-string">'clés
'</span>
l=<span class="hljs-number">5</span>
>chcp <span class="hljs-number">65001</span>
Page de codes active : <span class="hljs-number">65001</span>
>ac
clés
<span class="hljs-string">'cl'</span>
l=<span class="hljs-number">2</span>
</code></pre></div>
<p>Donc le 'é' est converti en 0.</p>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484502023-01-17T15:20:03+01:00ache/@achehttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248450<blockquote>
<p>Oui l’encodage du compilateur et celui de la console sont différents, c’est justement ce que l’appel à setlocale est sensé résoudre d’après le cours… </p>
</blockquote>
<p>Ah donc tu es au courant que c’est ça le problème de écrit => écrit. J’avais mal compris ta mise en situation.</p>
<blockquote>
<p>Du coup pourquoi setlocale ne fonctionne pas comme attendu, ce serait plutôt ça la question ?</p>
</blockquote>
<p>Alors là, je réponds que justement, le Windows Terminal ne permet pas d’entré en UTF-8. D’après, le bug trouvé sur Github.</p>
<p>Si tu as python d’installer tu peux éventuellement tester ceci pour voir si le problème est bien le même.</p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span></div><pre><code class="hljs language-py"><span class="hljs-meta">>>> </span>s = os.read(<span class="hljs-number">0</span>, <span class="hljs-number">10</span>)
こんにちわ
<span class="hljs-meta">>>> </span>s
</code></pre></div>
<p>Ou pour être plus Français (🐓 🇫🇷 🥖) car le japonais c’est pas simple à taper pour nous :</p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span></div><pre><code class="hljs language-py"><span class="hljs-meta">>>> </span>s = os.read(<span class="hljs-number">0</span>, <span class="hljs-number">8</span>)
élégant
<span class="hljs-meta">>>> </span>s
</code></pre></div>
<p>Si tu remplaces:</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span></div><pre><code class="hljs language-text">
char ligne[255];
if (fgets(ligne, sizeof ligne, stdin) == NULL)
{
perror("fgets");
return EXIT_FAILURE;
}
</code></pre></div>
<p>Par :</p>
<div class="hljs-code-div hljs-code-text"><pre><code class="hljs language-text">char ligne[255] = "éléphant !";
</code></pre></div>
<p>Ça marche mieux ?</p>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484492023-01-17T14:59:44+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248449<figure><blockquote>
<p>Oui l’encodage du compilateur et celui de la console sont différents, c’est justement ce que l’appel à setlocale est sensé résoudre</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248447">AScriabine</a></figcaption></figure>
<p>pas tout à fait, setlocale permet d’utiliser la locale du système (Windows) mais le terminal est un programme comme un autre, alors comme ton petit programme, il décide quel encodage il utilise pour faire son rendu (et même sa saisie) qui n’est pas forcément celui du système. (ce que je trouve bizarre, je n’ai pas vraiment la réponse au poste initial de pourquoi ça marche pas, j’essaie juste d’éclaircir un point)</p>
<p>Remarque par ailleurs que le "é" de "écrit" ne produit pas le même affichage que le "é" de "élégant". Cela parce que "écrit" vient du litéral encodé par le format de ton fichier (dans quel encodage as-tu enregistré ton fichier ?) et "élégant" vient de la saisie utilisateur encodé dans le format de travail du Terminal.</p>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484472023-01-17T14:05:28+01:00AScriabine/@AScriabinehttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248447<p><a href="/@ache" rel="nofollow" class="ping ping-link">@<span class="ping-username">ache</span></a></p>
<p>Oui l’encodage du compilateur et celui de la console sont différents, c’est justement ce que l’appel à setlocale est sensé résoudre d’après le cours… Du coup pourquoi setlocale ne fonctionne pas comme attendu, ce serait plutôt ça la question ?</p>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484462023-01-17T13:47:56+01:00ache/@achehttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248446<p>Bien, je t’invite à lire ce tutoriel: <a href="https://zestedesavoir.com/tutoriels/1114/comprendre-les-encodages/">Comprendre l’encodage</a>.</p>
<p>Ici c’est un cas typique de chaîne UTF-8 interprétée en latin-1.</p>
<p>C’est que manifestement ton terminal n’utilise pas l’encodage de ton compilateur ^^" </p>
<p>De plus, la raison pour laquelle tu obtiens est que Windows Terminal (par défaut sur Windows 11) ne supporte pas les entrées en UTF-8. Il les remplaces par 0 manifestement.</p>
<p>Le ticket de bug: <a href="https://github.com/microsoft/terminal/issues/11956">https://github.com/microsoft/terminal/issues/11956</a></p>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484452023-01-17T13:32:56+01:00etherpin/@etherpinhttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248445<p>Je pense qu’il y a un problème d’encodage, à cause du message <kbd>écrit(s)</kbd>.
Quoi qu’il en soit, que se passe-t il si tu rentre <kbd>Élégant</kbd> ?</p>Code du cours ne fonctionne pas sur mon ordi... Je suis coinced, message #2484442023-01-17T13:12:27+01:00AScriabine/@AScriabinehttps://zestedesavoir.com/forums/sujet/16755/code-du-cours-ne-fonctionne-pas-sur-mon-ordi-je-suis-coinced/?page=1#p248444<p>Salut !</p>
<p>J’essaye de tester un code du cours sur mon ordi, il ne fonctionne pas. Il s’agit d’entrer une chaine de caractères dans le terminal, de mettre celle-ci dans une chaine de caractères larges, puis de la re convertir en chaine de chars, et de la réafficher dans le terminal (exercice de cours quoi). </p>
<p>Dans le cours, cela correspond à cette partie : Notions avancées -> Les caractères larges -> Les entrées récupérées depuis le terminal -> La fonction wcstombs (lien : <a href="https://zestedesavoir.com/tutoriels/755/le-langage-c-1/notions-avancees/les-caracteres-larges/#la-fonction-wcstombs">https://zestedesavoir.com/tutoriels/755/le-langage-c-1/notions-avancees/les-caracteres-larges/#la-fonction-wcstombs</a>)</p>
<p>Je vous copie bêtement le code d’exemple du cours que j’ai exécuté :</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span></div><pre><code class="hljs language-text">#include <locale.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ligne[255];
if (fgets(ligne, sizeof ligne, stdin) == NULL)
{
perror("fgets");
return EXIT_FAILURE;
}
if (setlocale(LC_CTYPE, "") == NULL)
{
perror("setlocale");
return EXIT_FAILURE;
}
wchar_t ws[sizeof ligne];
if (mbstowcs(ws, ligne, sizeof ligne) == (size_t)-1)
{
perror("mbstowcs");
return EXIT_FAILURE;
}
size_t n = wcstombs(ligne, ws, sizeof ligne);
if (n == (size_t)-1)
{
perror("wcstombs");
return EXIT_FAILURE;
}
printf("%zu multiplet(s) écrit(s) : %s\n", n, ligne);
return 0;
}
</code></pre></div>
<p>Voici ce qu’il produit dans l’exemple du cours :</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span></div><pre><code class="hljs language-text">Élégant
10 multiplet(s) écrit(s) : Élégant
</code></pre></div>
<p>… Et voici ce que cela produit sur mon ordi :</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span></div><pre><code class="hljs language-text">élégant
8 multiplet(s) écrit(s) : 'l'gant
</code></pre></div>
<p>Bien-sûr, la question porte sur le 'é' de "élégant". </p>
<p>Voilà si vous avez des pistes/des idées… Merci beaucoup <img src="/static/smileys/svg/pleure.svg" alt=":'(" class="smiley"> </p>
<p>(je suis sous windows 11)</p>