Dans un formulaire HTML, à moins de le forcer via l'attribut accept-charset de la balise form, le navigateur envoit les données dans le même charset que la page. Du coup si la page est en UTF-8 les données sont envoyées en UTF-8. Ce qui après tout est le but. Encore faut-il que le serveur d'application sache lire les données, je pense notamment à Tomcat & JBoss.

Dans le cas d'un GET. Le fameux paramètre URIEncoding=UTF-8, permet de s'en tirer et d'interpréter correctement les données en URL. Lors du POST d'un formulaire url-encoded, le navigateur ne précise pas le charset et les données sont dans le corps. Du coup le serveur d'application ne sachant pas quoi faire tombe dans son comportement par défaut. Dans le cas de JBoss, il décode les données du formulaire en ISO-8859-1. Et là, c'est le drame.

Une petite astuce à faire au niveau d'Apache, il suffit de surcharger l'en-tête du type de contenu:

SetEnvIf Content-Type "application/x-www-form-urlencoded" utf8_form=true
RequestHeader set Content-Type "application/x-www-form-urlencoded; charset=UTF-8" env=utf8_form

Et voilà, plus de problème, JBoss interprète correctement le charset.