Le site officiel de jesus2099 (oh yeah)

blog-notes: Test en ligne d'encodages en PHP et javascript

Archives

13 juillet 2005

Test en ligne d'encodages en PHP et javascript

Grâce au XMLHttpRequest il est possible de tester en ligne les différents encodages disponibles en javascript et, surtout, en PHP!

  • javascript
    • escape / unescape
    • encodeURI / decodeURI (risqué *)
    • encodeURIComponent / decodeURIComponent (risqué *)
  • PHP
    • utf8_encode / utf8_decode
    • urlencode / urldecode
    • rawurlencode / rawurldecode
    • base64_encode / base64_decode

Et maintenant, voici le super test en ligne! Et en anglishe, comme ça, ça fait carrément très PRO™!

Online encoding test

TEST:

Conclusion

rawurlencode est mieux car il transforme absolument tous les caractères spéciaux en %XX, y compris l'espace (le blanc). Il est donc très pratique pour fabriquer des URL (pour les paramètres).

base64_encode est chouette également car le résultat est plus compact. Mais il ne peut pas être utilisé pour fabriquer des paramètres pour les URL car les =, qu'il produit souvent, y sont interdits.

Une fois qu'on a récupéré un paramètre, du côté PHP, on a besoin de utf8_encode pour afficher correctement son contenu dans une page Unicode. Sans ça, on aura quelque chose comme Fran£Aois à la place de François! Une page Unicode doit comporter ce tag dans son <head>: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

Dans le même ordre d'idée, je dois faire un truc spécial pour pouvoir conserver mes caractères unicodes (comme デ qui donne %u30C7 ou ệ qui donne %u1EC7) car le code $_REQUEST["test"] de PHP comprend %XX mais pas %uXXXX.

Donc, après avoir récupérer mon paramètre ($_REQUEST["test"]), je le passe à travers la fonction suivante:

function unicode_decode($txt) {
 return(ereg_replace('%u([[:alnum:]]{4})', '&#x\1;',$txt));
}

Finalement, le escape est parfois pratique car c'est le seul que l'on puisse utiliser du côté client.

Au secours! C'est le bazar!

Pour s'y retrouver!

escape (javascript), urlencode (php) et rawurlencode (php) permettent d'obtenir des chaînes sans caractères spéciaux grâce aux codes comme %B2 ou %u30C7 (Unicode) pour passer des paramètres dans les URL. PHP traduit automatiquement les %XX en caractères, mais on a besoin d'une fonction supplémentaire pour lui faire comprendre les %uXXXX.

utf8_encode permet de dire à PHP que nos caractères font partie du jeu de caractère Unicode.

UUTUHC™ est un petit script qui fabrique des &#XXXX;. Ces codes ne servent qu'à être écrits dans des pages HTML. Je l'ai utilisé ici pour préremplir mon champ texte TEST. Sans ça, j'aurais eu des caractères bizarre dans ma propriété value (<input value="$^本ệ..."/>) et la page n'était plus valide xhtml.

PS

Je ne sais plus moi-même ce que j'ai écrit là, mais je suis sûr que ça peut servir à quelques personnes... non? /(^_^)/

* Mise à jour du 2005.08.10

Les fonctions javascript encodeURI et encodeURIComponent ajoutées grâce à Anonymous puis à xkr.us.

Elles permettent de faire la même chose qu'en PHP! Mais attention! Les anciens navigateurs ne connaissent pas ces fonctions. J'ai testé les navigateurs suivant:

Opera 8.02
OK
Firefox 1.0.6
OK
Internet Explorer 6
OK
Netscape 7.2
OK

jesus2099 . 16:35 . Poster ce message

16 commentaire(s)

Si si :) Moi ça m'a beaucoup servi :)

Merci beaucoup, tu m'as évité des heures de galère :)

Anonymous Anonyme . 07/08/05 22:45

Merci je suis ravi;
J'espère voir le résultat!

Blogger jesus2099 . 08/08/05 18:07

Il y a beaucoup de bonnes choses dans ta page mais je n'ai pas reussi a resoudre mon probleme...
Je fais passer de javascript vers PHP une string en langue etrangere en l'encodant avec la fonction escape.
J'ai donc un truc du style :
var str=escape(stranger)
"http://www.popo.com/popo.php?s="+str

Mais la chaine arrive sur ma page
popo.php de la forme : %u05DE%u05E1%u05E2%u05D3%u05D4

J'ai utilise ta super fonction unicode_decode qui permet d'afficher cette chaine et ca marche.

Mais comment je peux faire si je veux manipuler cette chaine par exemple l'envoyer en query string de google? Il me faudrait une chaine du genre:
%AA%D7%9E%D7%95%D7%A0%D7%95%D7%AA

Je suis un peu perdu donc si quelqu'un a une idee...

Anonymous Anonyme . 10/08/05 09:25

Est-ce que tu veux faire ça en PHP ou en Javascript?

En Javascript, c'est pas génial, tu es obligé de fabriquer une moulinette.

Par contre en PHP, comme je l'ai dit (mais c'est le fouillis), tu peux utiliser un truc comme ça:

$urlparam= rawurlencode(unicode_decode($_REQUEST["s"]));

Ou, si tu veux que les espaces soient convertis en «+» plutôt qu'en «%20»: urlencode().

Blogger jesus2099 . 10/08/05 14:22

J'ai fini par trouver la bonne fonction javascript :

encodeURIComponent

Elle n'est valide que pour IE 5.5+, Netscape 6+ et Mozilla...

Anonymous Anonyme . 10/08/05 16:54

Merci Ano (?)
Grâce à toi j'ai enrichi un peu le message – qui devient de plus en plus charabia!

PS: Tu peux laisser un pseudo et/ou un lien vers ton site, en choisissant de laisser un commentaire avec le réglage Other ou Autre plutôt que Anonymous ou Anonyme, si tu veux.

Blogger jesus2099 . 10/08/05 17:56

salut
je cherchais à transmettre des valeurs saisies dans un formulaire via javascript (pour une application en ajax) dans une url pour être ensuite interprété par un script PHP.
Franchement l'encodage des caractères ca me dépasse totalement : je galère systématiquement là-dessus.

hé bien je crois que j'ai écrit la bonne fonction pour la situation qui me concerne :


function encodeMonTexte(texte) {
URIencode = encodeURIComponent(texte);
retour = URIencode.replace(/'/g, "\\'");
return(retour);
}

voilà.

Anonymous jérôme . 20/08/06 18:50

Merci Jérôme, voilç qui pourra servir à autrui ! (^_^)
Jérôme M. ?

Blogger jesus2099 . 21/08/06 01:03

Merci à Jérome & bien sur à jesus2099, car cette fonction

function encodeMonTexte(texte) {
URIencode = encodeURIComponent(texte);
retour = URIencode.replace(/'/g, "\\'");
return(retour);
}

m'a vraiment servi !!!

Baudouin

Blogger Baudouin . 08/02/07 17:24

Salut, grace à toi je viens de m'apercevoir que mon nettoyage en php de code alphanumérique ne marche pas si la variable est "ça 2 "_'-+*/²&$ RFC1738 エンコーディング tiếng Việt"

echo ereg_replace( '[^a-z0-9_]', '', "ça 2 "_'-+*/²&$ RFC1738 エンコーディング tiếng Việt" );

résultat: a2rfc17381245612531124671254012487124511253112464ti7871ngvi7879t


si je fais le même traitement en javascript ça marche.
var chn = "ça 2 "_'-+*/²&$ RFC1738 エンコーディング tiếng Việt";
var exp = RegExp( "[^a-z0-9_]", "g" );
alert( chn.replace( exp, '' ));

résultat:
a2_rfc1738tingvit


mais mon but est d'avoir ce même résultat en php car parfois je ne passe pas par le javascript pour mon nettoyage.

Aurais tu une solution ?

Laurent

Anonymous Anonyme . 16/02/07 19:20

Oui, j'ai une solution :-)

En fait, chez moi ça marche mais le truc c'est que tu dois avoir des &xXXXX; dans ta chaîne, à la place des caractères spéciaux.

En fait je ne pense pas que tu fasses directement ereg_replace( '[^a-z0-9_]', '', "エンコーディング" );. Je pense que tu fais plutôt ereg_replace( '[^a-z0-9_]', '', $str ); et que tu récupères $str de je ne sais où.

Donc il faut que tu tranforme tes &xXXXX; en caractères avant de faire le ereg_replace(). Il existe une fonction pour ça : html_entity_decode($str, ENT_COMPAT, "UTF-8").

Mais si, comme dans mon PHP, tu as un bug (cannot yet handle MBCS), tu peux utiliser la fonction de remplacement qui est proposée dans la page du bug (bug #25670).

Voici une démo de ce que tu veux faire : encodeLaurent.php (source)

PS. juste au cas où. Si tu veux aussi garder les lettres majuscules, tu peux utiliser ereg_replace('[^a-zA-Z0-9_]', ...

PPS. Dis-moi quand je pourrais supprimer encodeLaurent.*

Blogger jesus2099 . 19/02/07 15:05

c'est super merci beaucoup
Ta fonction unicode_decode() est aussi utile que simple

Anonymous Anonyme . 01/03/07 15:45

Merci ça marche comme ça mais ce n'est pas correct, pourquoi ?
parceque ça ne converti pas ta chaine $strhtml exactement comme $str.

Dans le traitement telle que je te l'ai donné ça marche uniquement.

D'ailleurs nombre de personne on réécrit la fonction html-entity-decode
voir http://www.php.net/manual/fr/function.html-entity-decode.php

je vais me faire ma fonction aussi (je te la posterai qd elle sera au point si tu le veux).

Je te remerci de m'avoir répondue, tu peux effacer encodelaurent.

Anonymous Laurent . 01/03/07 18:00

Bonjour,

J'utilise un formulaire qui renvoie les $_POST[""] sur la même page et les réaffiche dans leur champs texte. Je voudrais afficher les valeurs telles que je les ai saisies et non pas avec les caractères au format "URL" (pour ensuite 're-submit' au bon format et réafficher sans les caratères spéciaux).

Comment puis-je faire ?

Merci,

Gwendal.

Anonymous Anonyme . 05/03/07 18:13

Bonjour, j'ai bien regardé toute la page, mais je n'est pas trouvé ce que je cherchais:
A partir d'une requete Ajax, je transmet des informations encodées par escape à mon fichier php.
Je reçois donc des caractères du type %u30B8. Le problème est que je n'arrive pas à les décoder, et j'ai forcément besion de les décoder (je dois comparer si 2 chaînes sont identiques). Y'a t-il un moyen de le faire?
merci

Anonymous tadkozh . 27/05/07 21:58

Salut tadkozh,
Ma page est un peu en vrac, mais il est bien écrit dedans, comment transformer les %uXXXX en caractères unicode. Il faut utiliser une fonction vachtement bien faite, par un anonyme : unicode_decode.
Et ça marche très bien! :)
Bonne continuation!

Blogger jesus2099 . 28/05/07 01:31

Ici pas de langage SMS du style eh mé c tro for t tou puiçan toa !. Si je suis de bonne humeur et que j'ai le temps je traduis, mais j'ai maintenant plutôt tendance à supprimer.

Ajouter un commentairePAS DE SMS !

Je participe au comité de lutte contre l'usage du langage SMS et des fautes volontaires sur Internet