Encodage français

Introduction

Ce tutoriel a pour vocation d'expliquer, puisque la question est très largement récurrente sur le forum, comment encoder le texte avec le système d'encodage de caractères francophones, et quelles sont les fausses idées reçues sur le sujet (en bref, pourquoi ASCII et UTF-8 ne fonctionnent pas correctement)

Problématique

Une question qui revient TRES souvent sur le forum est :
"Pourquoi quand j'utilise <ital>System.Text.Encoding.ASCII, je perd mes caractères accentués? J'ai bien essayé UTF-8 mais ça ne marche pas non plus!"</ital>

Si vous voulez juste la ligne de code qui résout votre problème, c'est tout en bas. Sinon vous avez l'explication de ce qui se passe concrètement et l'erreur que vous faites en utilisant ces jeux de caractères.

Explications

La réponse est très simple! Le jeu de caractères ASCII correspond en fait à l'ASCII US! La spécificité de ce jeu de caractères est qu'il ne contient QUE les caractères ASCII standards (donc communs à tous les jeux basés sur l'ASCII) et non étendus. En somme, tous les caractères de codes ASCII non compris entre 0 et 127 ne sont pas reconnus par ce jeu de caractères! Hors, les caractères accentués ou autres caractères spéciaux (que vous ne trouverez pas sur un clavier qwerty, pour essayer de rendre ça le plus imagé pour les néophytes :D) ont un code ASCII non compris entre 0 et 127 (>=128 ou <0, selon que le char sont signés ou non sur notre machine).

Mais alors, l'UTF-8 prend pourtant correctement en charge les caractères accentués, alors pourquoi il ne me les reconnait pas?
Tout simplement parce que votre OS est configuré pour utiliser un autre jeu de caractères. Imaginons que pour l'OS, le caractère "é" aie pour code numérique, dans son jeu de caractères, 151 (je n'en sais rien, je dis n'importe quoi), et qu'en UTF-8, le caractère "é" aie pour code numérique 222 (encore une fois c'est une valeur donnée au hasard). La où vous vouliez mettre "é", vous mettez 151, et cela devient alors é, car en UTF-8 c'est ça, 151....
Il faut bien comprendre (et c'est ce qui est primordial dans la compréhension de ce qu'il se passe réellement) que lorsque l'on manipule un caractère, on manipule quelque part en mémoire une valeur numérique. Cette valeur numérique est simplement associée à deux caractères différents dans les deux jeux de caractères.
Ce n'est pas très clair? Alors faites moi une proposition en commentaire pour rendre ça plus compréhensible (c'est déjà pas facile a expliquer)!

En bref, c'est un simple problème de compréhension. Le code numérique de caractère que vous donnez à votre application dans l'encodage de votre OS correspond en réalité à un autre caractère dans l'encodage que vous spécifiez dans votre application.

Une première solution, ayant avantages et inconvénient, est d'appeler une méthode permettant de récupérer l'encodage utilisé par votre OS. Ainsi, sans se poser de question,

Text.Encoding.GetEncoding(0);

vous permettra de récupérer votre encodage correctement. Mieux, cela permettra à votre application d'être utilisée dans une autre langue sans modifications. Mais si quelqu'un aime son OS en anglais mais doit utiliser votre application en français, il perdra ses caractères accentués...

L'encodage utilisé en France obéit a la norme iso-8859-1, norme qui a évolué en iso-8859-15 pour intégrer le symbole "?".
C'est cet encodage qu'utilise votre OS. Donc afin que votre application écrive dans votre flux dans le jeu de caractères que vous voulez, et que vous voulez le forcer, il faut utiliser cet encodage, et donc appeler

Text.Encoding.GetEncoding("iso-8859-1");
Ce document intitulé « Encodage français » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous