Niveau :      
Résumé : urlencode ; punycode ; htmlencode ; quoted-printable

Comme je vous l'ai déjà dit, l'utf8 est un encodage utilisé pour la table de caractère unicode.

Il existe un certain nombre d'autres encodages écrits pour répondre à des contraintes particulières, la plupart du temps, il s'agit d'éviter certains codes déjà utilisés dans une application. Après le base 64 nous allons voir des encodages pour les url, pour le html et pour les emails.

Remarquez que chacun de ces encodages peut encoder plusieurs tables de caractère et que celle-ci n'est pas toujours spécifiée.

Url encode

L'encodage pour les urls a pour but d'éviter un certains nombre de caractères qui posent problème dans la manipulation et le parsing d'url , c'est à dire entre autre : l'espace, /, :, ?, # et les caractères non ascii

Cet encodage concerne toute l'url à l'exception du nom de domaine qui lui utilise le punycode lorsque c'est un idn (com pliqué hein !).

L'encodage d'url ne précise pas la table encodée, ce qui veut dire que cela peut aussi bien être de l'unicode que de l'iso8859-1 ou une autre table (elle doit être compatible ascii puisque certains caractères ascii sont définis dans la norme). Le type est souvent implicite et dépend de la table utilisée dans les pages précédant ou contenant le lien.

La méthode est assez simple, on remplace tous les caractères qu'on veut transformer en %XX où XX est le code hexadécimal du caractère. On est autorisé à encoder n'importe quel caractère de cette façon. Les caractères suivants devraient être encodés uniquement dans le cas où ne servent pas de séparateur :

!  *  '  (  )  ;  :  @  &  =  +  $  ,  /  ?  %  #  [  ]

.. ainsi que les caractères non alphanumériques (à quelques exceptions près).

Pour les détails, suivez la RFC, cette dernière spécifie (c'est récent) que la table utilisée devrait être utf8 (et non pas unicode).

Punycode

Cet encodage a été inventé pour palier les limitation des noms de machines. La RFC est assez complexe, son auteur a trouvé ça rigolo de la décrire sous forme de machine à état fini (math, informatique et crack, c'est pas très bon pour la santé mentale). Cet encodage cherche à conserver une forme de lisibilité en regroupant les caractères ascii lisible au début du texte.

Ce qu'il faut retenir c'est que les noms de domaine internationalisés ressemblent à ceci xn--caractresascii-blob où xn-- est une constante, caractresascii contient les caractères ne nécessitant pas d'encodage et blob une version encodé des autres caractères.

Html encode

L'encodage html vise à éviter au moins les caractères spéciaux suivants : < > & ... et d'autres, mais c'est moins utile.

Il consiste en l'utilisation de la forme &code; il existe deux types de codes, les codes nommés comme lt ou eacute qui n'ont pas besoin de table et les codes numérotés comme #65 ou #x41. La table encodée est cette fois précisée puisque c'est unicode.

Notez qu'a part pour < > et & (et " et ' dans certains endroits), cet encodage n'a rien d'obligatoire puisqu'il est possible de préciser l'encodage dans l'en-tête du fichier (ou lors de la transmission du fichier en http) et donc d'utiliser directement un encodage lisible comme l'utf8.

Pour les détails, retrouvez la page du w3c correspondante.

Quoted printable

Cet encodage a été inventé pour palier la limitation aux caractères 7 bits du contenu des emails. La table sous-jacente est précisée dans l'en-tête de la partie encodée donc tout est clair.

La technique est simple, tout caractère qui sort des valeurs 0x21-0x7E (ou de 33 à 126 à l'exception du = ) est encodé par un = suivi de sa représentation hexadécimale. Exemple =3D

On retrouve tout ça dans un paragraphe de la RFC sur le format des emails.

bugs

On peut reconnaître qu'on probablement a un problème d'encodage quand on a des pattern comme ceux-ci :

%253A%252F%252F : %25 encodant le %, il s'agit de __://__
&amp;lt; : &amp; encodant &, il s'agit de < htmlencodé plusieurs fois

Si vous reconnaissez un schéma d'encodage dans une page qui devrait être décodée, le source est probablement encodé plusieurs fois.

Sachez reconnaitre aussi le type d'encodage pour savoir s'ils ont bien leur place où ils sont. Il est par exemple normal, mais rare, de d'avoir des url qui sont aussi htmlencodées.

Et notez qu'il est possible de superposer les encodages.