Très bien cet article captain_torche, merci

Joli coup pour le remplacement des accents, je n'y aurais pas pensé.
Concernant la fonction is_utf8, c'est une détection d'octets longs assez approximative... en fait il n'est pas possible de détecter efficacement (sans
BOM ... et encore c'est une indication uniquement) si une chaîne est encodée ou non en UTF-8 (ou un autre chartset). Pour information il existe également une extension de PHP qui permet de faire le même travail que cette fonction qui s'appelle
mbstring (pas toujours disponible car il faut l'installer, elle n'est pas présente par défaut) et la détection peut se faire grâce à
mb_detect_encoding. Maintenant, rien qu'en lisant les commentaires on s'aperçoit que la détection doit se faire sensiblement de la même manière vu les bugs liés à divers caractères étendus. Mais c'est tout de même mieux que de simplement ignorer l'UTF-8 et je ne vois de toute façon pas de solution viable... c'est pour cela qu'il n'est pas recommandé d'avoir des charset différents dans un même système
Encore une chose, urlencode ou plutôt rawurlencode (une des différences entre ces deux fonction est l'encodage des espaces, respectivement "+" et "%20") suit la RFC1738 et s'applique aux données passée dans la
querystring. Pour ce qui vient avant la
querystring, il faut procéder à un double encodage, cela correspond à la
RFC3986, section 2.5). Mais cela pose d'autres problèmes au niveau des moteurs de recherches qui ne semblent pas respecter cette RFC3986 en stockant des URL décodées,
comme je l'avais évoqué précédemment.