begin process at 2008 08 22 04:14:38
1 229 771 membres
42 nouveaux aujourd'hui
14 267 membres club

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 : 3 639 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

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS