[PHP] Envoi de chaines de caractères spéciaux [Résolu/Fermé]

Signaler
Messages postés
39
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
23 janvier 2016
-
 JCBR Info -
Bonjour,

Je rencontre un petit problème avec l'envoi d'une chaîne de caractère comportant des caractères spéciaux, tels que le "$" ou le "|".
Existe-t'il une fonction permettant l'envoi de ces derniers?

J'arrive à envoyer tous les autres avec la fonction htmlentities() de php mais ces deux là sont récalcitrants :s


Exemple:

$var = htmlspecialchars('\$!\*³ê³¡÷׿?§1568}]@^\[{#~´´~œœ“Œ');
=>affiche alors \$!\*³ê³¡÷׿?§1568}]@^\[{#~´´~œœ“Œ sans le $! qui est considérée comme une variable

$var = htmlspecialchars('\$!\*³ê³¡÷׿?§1568}]@^\|\[{#~´´~œœ“Œ');
=>affiche seulement \\*3ê3¡÷׿?§1568}]@^\ , jusqu'au pipe qui est alors considéré comme un "ou"...



Si quelqu'un peut m'aider à palier ce problème.. merci!

10 réponses

Messages postés
39
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
23 janvier 2016
6
Bonjour,

Personne n'aurait une petite idée? :s
Messages postés
49
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
7 avril 2009
9
Bonjour,

Moi pour régler le problème de caractère spéciaux, j'ai une petite fonction qui me permet de remplacer des éléments dans une chaine de caractère et une autre fonction qui remplace à nouveau.
Je sais pas si ca va marcher dans ton cas pour les caractères $ et |

Essaye avant d'envoyer de faire:
$mess=str_replace("$","&doll;",$mess);

en ensuite en reception
$mess=str_replace("&doll;","$",$mess);

Pareil pour |.

Dis moi si ca marche ca m'intéresse bien...

Nep
http://www.cultureg.com
Bonjour

$var = htmlspecialchars etc... n'a jamais rien affiché. $! ne peut en aucun cas être pris pour une variable dans cette chaîne, pas plus que le pipe ne peut être pris pour un OU.
Peux-tu décrire ce qui se passe vraiment ? Qu'arrive-t-il à tes variables entre l'affectation ($var=..) et le moment où tu les affiches (echo) ?
Tu as peut-être un problème d'encodage : si tu écris ton script en iso-8859-1 et que dans l'en-tête tu dis que c'est de l'UTF-8 (ou l'inverse...) normal que ça affiche n'importe quoi avec htmlspecialchars.
Messages postés
39
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
23 janvier 2016
6
Bonjour,

Au niveau de l'envoi ça a l'air de bien fonctionner, sans le convertir en réception de reçoit "& amp;doll;" (sans espace) à la place de "&doll", ça doit venir de mon codage en utf-8 peut-être.

Je regarde pour la reconversion en réception comme c'est dans un script Python et je te dit ça, merci beaucoup en tous cas!
Je veux bien t'aider, mais il faudrait que tu répondes à mes questions. Le $amp;doll; signifie que tu as appelé deux fois htmlentities sur le caractère $ : la première fois, tu obtiens &doll; la deuxième fois, le & est traduit à son tour et ça devient &doll;.
Messages postés
39
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
23 janvier 2016
6
Bonjour,

Désolé, je n'avais pas vu ta réponse Toto :s

Alors pour ce qui est du codage j'ai déclaré de l'utf-8 dans ma page PHP, pour que ce soit compatible avec mon script Python.

header ( 'content-type: text/html; charset=UTF-8' );

Pour ce qui est de ma variable de caracteres spéciaux,


Partie PHP

function otherChar($mess) {
$mess=str_replace("$","&doll;",$mess);
$mess=str_replace("|","&pipe;",$mess);
return $mess;
}

$var = htmlspecialchars(otherChar('\$!\*³ê³¡÷׿?§1568|}]@^\ \[{#~´´~œœ“Œ'));
setCVAr(array('Test', 'NOM', 'Taylor', 'ééé', 'test@live.fr', $var));
$CVArImplode = addslashes(implode("|", $this->CVAr));

echo `/usr/bin/python affichage_text.py "$CVArImplode" "$ThemeTMPImplode" "$this->nom" "$this->nomTMP"`;



Partie Python

#! /usr/bin/python

# -*- coding: utf-8 -*-


import socket

import uno

import string

import sys #Librairie qui permet de recuperer les variables passees en parametre.

CVArImplode = unicode(sys.argv[1].decode('utf-8'))
CVAr=CVArImplode.split("|")

data={}



#Modification du contenu de la variable ThemeTMP puis insertion des donnees dans le tableau de donnees "data"

for i in range(0,len(ThemeTMP)):

ThemeTMP[i]="[var."+ThemeTMP[i]+"]"

data[ThemeTMP[i]]=CVAr[i]

#Parcours le tableau de donnees "data" et remplace les variables par le contenu desire.

for find,replace in data.items():

findandreplace(document,search,unicode(find),unicode(replace))




Voila les grandes lignes de mon code!
Il permet de remplacer dans un document texte des noms de variables stockées dans un tableau ThemeTMP par le contenu de mon tableau CVAr.

EDIT: Je n'ai pas trop compris le problème de codage que tu proposes, comment est-ce que je pourrais écrire en iso si je déclare mon script en utf-8? Question surement bête mais le codage, c'est pas mon fort :s
Sinon j'ai regardé au niveau de mon serveur, il est configuré en utf-8. ("env" en ligne de commande dans le terminal debian).
Je suis très embêté pour te répondre parce que je ne comprends pas le python et je ne sais pas du tout comment lui il traite les caractères et leur codage.
Mais je suis sûr que le htmlspecialchars(otherChar(... est une erreur. C'est ça qui provoque le & amp;doll; le otherChar transforme le $ en & doll; . le htmlspecialchars transforme le & en & amp; d'où le résultat & amp;doll;
À ta place je n'utiliserais pas du tout otherChar, et j'utiliserais htmlentities au lieu de htmlspecialchars.

Je ne maîtrise pas tout (loin de là) au niveau des codages mais il me semblerait logique que le script doive être écrit en utf-8 lui aussi. Mais il faudrait tout aussi logiquement dire à PHP avec quel encodage on travaille et je ne sais pas comment ça peut se faire.
Messages postés
39
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
23 janvier 2016
6
Bonjour,

D'accord, je vais chercher sur ces pistes alors.
Au pire je ferais simplement un remplacement de chaîne de caractère dans mon script Python pour ré-obtenir le $ et le |, c'est pas un codage "beau" mais bon..

Merci beaucoup pour vos réponses Nep_51 et Toto!
Messages postés
39
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
23 janvier 2016
6
Petit up!

Seul le "$" me pose problème en fait, pour le pipe c'est normal, j'avais oublié que je l'avait utilisé en tant que caractère séparateur dans ma fonction implode...
Un code non-erroné qui réglerait ton problème serait:
$var = str_replace('$', '$', htmlspecialchars('\$!\*³ê³¡÷׿?§1568|}]@^\ \[{#~''~oeoe"OE', 'UTF-8'));

Explications:
* htmlentities convertit tout ce qui a une entité nommé.
* Comme le symbole "$" n'a pas d'entité nommé, on va le remplacer par son entité numérique.

Cependant, ça ne marchera que pour les chaînes UTF-8 ayant que des caractères mono-octet (des caractères ASCII, au bout du compte). Même les caractères accentués du français risque de poser problème (codés en 2 octets en UTF-8 et donc, décomposés en deux caractères en PHP). En effet, seule la bibliothèque MBString supporte réellement les chaînes de caractères multi-octets pour le moment. Si tu veut une solution vraiment efficace pour tout type de caractères, Google est ton ami.

Moi, j'ai trouvé ça: http://www.asp-php.net/ressources/codes/PHP-UTF8+entities.aspx

PS: Pour l'opération inverse en PHP, je te recommande mb_convert_encoding(). (N'oublie pas de bien configurer MBString si tu souhaite l'utiliser.)