Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ENCODAGE FRANCAIS


Information sur le tutorial

Catégorie :Chaîne de caractères Tutorial .NET ( DotNet ) Date de création : 02/08/2007 12:39:02 Vu : 5 622 fois

Note :
Aucune note

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une 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");
02 août 2007 12:40:21 :
Erreur d'upload
02 août 2007 12:58:07 :
upload encore buggé
signaler à un administrateur
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.

signaler à un administrateur
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...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,172 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.