Une question qui revient TRES souvent sur le forum est :
"pourquoi quand j'utilise System.Text.Encoding.ASCII, je perd mescaractères accentués? J'ai bien essayé UTF8 mais ca ne marche pas nonplus!"
Si vous voulez juste la ligne de code qui résout votre problème, c'esttout en bas, sinon vous avez l'explication de ce qui se passeconcrètement et l'erreur que vous faites en utilisant ces jeux decaractères.
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ère et qu'il ne contient QUE lescaractères ASCII standards (donc communs a tous les jeux basés surl'ASCII) et non étendus. En somme, tous les caractères de codes ASCIInon compris entre 0 et 127 ne sont pas reconnus par ce jeu decaractère! hors, les caractères accentués ou autres caractères spéciaux(que vous ne trouverez pas sur un clavier querty, pour essayer derendre ca le plus imagé pour les néophytes :D) ont un code ASCII noncompris entre 0 et 127 (>=128 ou <0, selon que le char sontsignés ou non sur notre machine).
Mais alors, l'UTF8 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 autrejeu de caractère. imaginons que pour l'OS, le caractère "é" aie pourcode numérique, dans son jeu de caractère, 151 (je n'en sais rien, jedis n'importe quoi), et qu'en UTF8, le caractère "é" aie pour codenumérique 222 (encore une fois cest une valeur donnée au hasard). La ouvous vouliez mettre "é", vous mettez 151, et cela devient alors é, caren UTF8 cest ca, 151....
Il faut bien comprendre (et cest la ce qui est primordial dans lacompréhension de ce qu'il se passe réellement) que lorsque l'onmanipule un caractère, on manipule quelque part en mémoire une valeurnumérique. Cette valeur numérique est simplement associée a deuxcaractères différents dans les deux jeux de caractères.
Cest pas très clair? Alors faites moi une proposition en commentairepour rendre ca plus compréhensible (cest deja pas facile a expliquer)!
En bref, cest un simple problème de compréhension. Le code numérique decaractère que vous donnez a votre application dans l"encodage de votreOS correspond en réalité a un autre caractère dans l'encodage que vousspécifiez dans votre application.
Une première solution, ayant avantages et incovénient, est d'appelerune méthode permettant de récupérer l'encodage utilisé par votre OS.Ainsi, sans se poser de question,
System.Text.Encoding.GetEncoding(0);
vous permettra de récupérer votre encodage correctement. Mieux, celapermettra a votre application d'être utilisée dans une autre languesans modifications. Mais si quelqu'un aime son OS en anglais mais doitutiliser votre application en francais, il perdra ses caractèresaccentué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, etque vous voulez le forcer, il faut utiliser cet encodage, et doncappeler
System.Text.Encoding.GetEncoding("iso-8859-1");