Encodage de formulaire multilingue

Intended audience: les codeurs XHTML/HTML (utilisant les éditeurs ou le script), les développeurs de script (PHP, JSP, etc.), les gestionnaires de projet Web, et quiconque étant à la recherche d’informations relatives à l’encodage des caractères dans un formulaire.

Question

Quel est le meilleur moyen de faire face aux problèmes d’encodage dans les formulaires utilisant plusieurs langues et scripts ?

Answer

La meilleure façon de faire face aux problèmes d’encodage dans les formulaires (X)HTML est d’utiliser l’UTF-8 pour l’ensemble des pages. L’UTF-8 peut représenter les caractères d’une multitude de langues. Les navigateurs renvoient les données dans le même encodage que la page contenant le formulaire. Ainsi, l’utilisateur peut remplir le formulaire dans la langue ou le script qu’il souhaite.

Les recommandations suivantes permettent de s’assurer que cette procédure fonctionne bien. Premièrement, il est important d’indiquer au navigateur que la page est au format UTF-8. Il existe plusieurs façons d’indiquer au navigateur l’encodage de la page . Dans tous les cas, ceci est important, encore plus si le format de la page ne contient pas lui-même des caractères étrangers à l’US-ASCII. Cependant, les utilisateurs peuvent taper d’autres caractères.

Deuxièmement, il peut être bien que le script qui reçoit les données du formulaire vérifie que les données renvoyées utilisent bien l’UTF-8 (au cas où quelque chose ne fonctionnait pas, par exemple si l’utilisateur avait changé l’encodage). La vérification est possible car l’UTF-8 possède un modèle d’octet très particulier absent des autres encodages. Si des données n’utilisant pas l’UTF-8 sont reçues, un message d’erreur devrait être envoyé.

Dans Perl, à titre d’exemple, une expression courante testée pour l’UTF-8 peut apparaître ainsi :

$field =~
  m/\A(
     [\x09\x0A\x0D\x20-\x7E]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;

Cela peut être adapté à d’autres langages de programmation. Il prend en compte différents problèmes tels que les encodages illégaux trop longs ou l’utilisation illégale d’encodages de substitution. Le programme ne sera validé que si $field est en UTF-8.