begin process at 2012 02 11 05:41:20
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Chaîne de caractères

 > ENCODAGE FRANCAIS

ENCODAGE FRANCAIS


 Information sur le tutoriel

Note :
Aucune note

 Description

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 systeme d'encodage de caractères francophones, et quelles sont les fausses idées reçues sur le sujet (en bref, pourquoi ASCII et UTF8 ne fonctionnent pas correctement)

Tutorial

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");

 Historique

02 août 2007 12:40:21 :
Erreur d'upload
02 août 2007 12:58:07 :
upload encore buggé

Commentaires

Commentaire de coq le 05/08/2007 17:05:37 administrateur CS

Je dirais plutôt que pour tout nouveau développement il faut utiliser de l'Unicode.

Le problème de décodage n'est pas aussi simple en fait :
Le fait de récupérer "Téléphone" à la place de "Téléphone" quand on décode de l'UTF8 avenc encoding d'europe de l'ouest (codepage 1252) s'explique par le fait qu'en UTF8 les caractères ne sont pas codés sur un seul octets, mais sur 1 à 4 octets.
Tous les caractères dont la valeur est comprise entre 0 et 127 sont codés sur un octets, au dessus de 127 ils le sont sur 2 à 4 octets.
'é' sera codé sur 2 octets.

Ainsi, "Téléphone" enregistré en Windows1252 sera représenté par :
    54 E9 6C E9 70 68 6F 6E 65

En UTF8 :
    54 C3 A9 6C C3 A9 70 68 6F 6E 65

Donc si jamais on décode de l'UTF8 en Windows1252, qui assume qu'un octet représente un caractère, on se retrouve avec un décodage de C3 A9 en "é" au lieu de "é"


A l'inverse, si on essaie de décoder le Windows1252 en UTF8 :
    54 E9 6C E9 70 68 6F 6E 65
Soit, en binaire :
    01010100 11101001 01101100 11101001 01110000 01101000 01101111 01101110 01100101
Au lieu de la séquence légitime :
    01010100 11000011 10101001 01101100 11000011 10101001 01110000 01101000 01101111 01101110 01100101

En UTF-8 :
si le premier bit d'un octet est 0, alors les 7 autres bits représentent le caractère : 0xxxxxxx
si le premier bit est 1, alors le nombre de bits de poids fort du premier octet donne le nombre d'octets sur lequel est codé le caractère, les octets suivants composant le caractère ayant leurs bits de poid fort à 10

La représentation binaire donnée ci dessus "représente" donc la suite suivante :
01010100 : 1 caractère sur 1 octet : T
11101001 : 1 caractère sur 3 octets, ce qui devrait donner la suite suivante 1110xxxx 10xxxxxx 10xxxxxx
01101100 : incohérence
11101001 : incohérence
01110000
01101000
01101111
01101110
01100101

La représentation finale dépend du traitement appliqué en cas d'erreur de décodage.

Commentaire de leprov le 05/08/2007 20:12:58

"Je dirais plutôt que pour tout nouveau développement il faut utiliser de l'Unicode."

Tout dépend de l'application. Si on a le choix, tout a fait d'accord (d'ailleurs .NET stocke en mémoire toutes ses chaines en unicode).
Mais on ne peut parfois pas faire autrement (dialogue avec un serveur FTP par exemple, ou parsage d'un fichier avec besoin de spécifier le format dans lequel il est pour une raison X ou Y)...
C'est bien pour ca que le tutoriel est la (la question revient de manière très récurrente, maintenant que j'ai fait le tutorial je pourrais vraiment crier sur ceux qui postent en posant la question et leur dire qu'ils pourraient chercher :D)

En tous cas merci pour ce complément qui permettra de rendre les choses plus pointues pour ceux qui le souhaiteront.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales