Le site officiel de moi

blog-notes officiel de moi
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.

J2_UUTUHC™ est un petit script qui fabrique des &#XXXX; (HTML Entities). 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

Catégories : ,

jesus2099 . 13 juillet 2005 16:35

Commentaires

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 . 06/02/07 04:09


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


Bonjour Jesus2099,

est-il possible de réutiliser votre fonction "conversionUnicode(texte)" de votre page "goodies_UUTUHC" ? (et la modifier pour les besoins de ma page ?) J'aimerai l'intégrer dans une console de saisi de kana pour obtenir leur code utf-8 rapidement.

Je peux vous envoyer le code de la console si vous le désirez.

Merci de me répondre et bonne continuation, votre site m'a beaucoup aidé (ça faisait une dizaine d'heure que j'étais sur la programmation de ma console et votre code est très pratique et beaucoup plus court que le mien).

Cordialement,
Keanjyto.

Anonymous Keanjyto . 30/09/08 12:23


Avec plaisir Keanjyto.
Je réponds oui à l'ensemble de tes questions. (^_^)
Note bien la nouvelle adresse de J2_UUTUHC, dans le message, plus haut.

Blogger jesus2099 . 30/09/08 13:17


Salut Jesus2099,

(si je peux me permettre de vous tutoyer à partir de maintenant)

je vais t'embêter encore un peu ;)...
Peux-tu m'expliquer cette ligne de ton code (j'ai pas mal cherché mais ça reste obscur pour moi ^^') :

return((c == 38)? '&' : ((c > 127)? '&#'+c+';' : n));

J'ai aussi mis en ligne ma console ici : 'http://keanjyto.ifrance.com/console_jap_v2.php'. Ceux qui le veulent peuvent réutiliser le code.

A l'origine, j'avais voulu la concevoir pour des raisons pratiques pour mon projet de japonais, mais maintenant je pense qu'elle est suffisamment aboutie pour pouvoir servir à d'autres personnes (grâce à toi).

A la prochaine !

Cordialement,
Keanjyto.

Anonymous Keanjyto . 01/10/08 05:40


Va pour le tutoiement ! (^_^)

c est le caractère saisi. Si c est un & (ampersand, 38 en décimal *), alors on remplace & par &amp;.
Si on ne faisait pas ça, le code généré ne serait pas conforme HTML car & est un caractère spécial HTML ne pouvant être utilisé seul, sans code;.

Pour constater ce que je dis, tu peux essayer de valider une page contenant le texte Coucou, c'est moi & co. puis Coucou, c'est moi &amp; co..
Seule la deuxième sera valide.

* 26 en hexa, 38 en décimal — J'ai travaillé ici en décimal, c'est au choix. Si j'écrivais le script aujourd'hui je le ferais putôt en hexadécimal, histoire de mieux coller aux codes unicodes qui sont toujours vu en hexa par usage (ici: \u0026). D'ailleurs si tu veux, je te dirais quand j'aurais fait ce changement.

PS. Merci pour le lien vers mon site ! Cependant, utilise plutôt l'adresse du site, sans "fr/" à la fin. (^_^;)y

Blogger jesus2099 . 01/10/08 09:58


Il manque un morceau à mon explication.

Si c > 127 (en gros on dépasse du iso-8859-1) alors on affiche son équivalent html entities décimal &#c;.

Voilou.

PS. Cela dit, il est toujours mieux (plus lisible et pas besoin de moulinettes) d'écrire des pages en utf-8 et d'utiliser des caractères unicode plutôt que ces HTML Entities.

Blogger jesus2099 . 01/10/08 10:02


I found this site using [url=http://google.com]google.com[/url] And i want to thank you for your work. You have done really very good site. Great work, great site! Thank you!

Sorry for offtopic

Anonymous Anonyme . 13/11/09 18:07


C'est fini, tu peux plus lacher des komz ! Trop tard.