Remplacer apostrophe penchee par apostrophe droite en php

Résolu/Fermé
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 - Modifié par diice le 17/01/2014 à 23:48
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 - 20 janv. 2014 à 22:27
Bonjour,


je suis soumis a un probleme de caractere.

mon client a une admin pour entrer des articles sur son site.
Pour remplir un article, souvent il est d'abord redigé sous word qui a pour apostrophe le signe ' (apostrophe penchée).
Donc, quand il copie colle son texte dans le textarea, le formulaire envoi en base de données ce meme signe.

vous me direz ce n'est pas grave, et si cela s'arretait la, effectivement ca ne le serait pas. sauf que...

pour des problemes que je ne maitrise pas, quand ces articles partent en newsletter, certains postes (pc et mac) avec outlook ou mail les caracteres affichent selon les postes des caracteres tout bizarres, voir ils enlevent carrement les apostrophes !

bref, je ne vais pas m'attarder sur ce probleme de mail, j'aimerai resoudre le souci a la base sans dire a mon client de relire systematiquement ses articles sous word pour corriger tous les apostrophes, au risque qu'il en oubli.
bref je pars du principe que c'est a moi d'adapter la machine...

donc, ma question est : comment remplacer l'apostrophe penchée en apostrophe droit en php ??
(sachant que mes textes sont soumis au htmlentities() avant l'entree en base, et que les fameuses apostrophes sont rentrées non codées)

merci d'avance a tous,

A voir également:

16 réponses

Utilisateur anonyme
20 janv. 2014 à 15:20
Comme ça, on voit que l'apostrophe penchée que tu as mis dans ton str_replace n'est pas celle qui apparaît dans ta page (code 146) mais une autre (unicode 0x2019 / UTF8 E2 80 99). Donc la substitution ne peut pas marcher.
De plus, tu inverses l'ordre des opérations str_replace et utf8_encode.
Puisque ta page de départ est en ISO-8859-1, il faut d'abord remplacer tes apostrophes, et ensuite seulement convertir en utf-8.
Je te propose donc :

return utf8_encode (str_replace (chr(146),"'",$txt)) ;
6
Utilisateur anonyme
18 janv. 2014 à 09:40
Bonjour

Tu devrais pouvoir le faire avec les fonctions habituelles du PHP, à condition de savoir exactement comment l'apostrophe qui te gêne est encodée.
Peux-tu coller un extrait de texte avec une apostrophe sur cjoint.com ? Et nous dire si tu travailles en utf-8 ou un autre encodage ?
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
Modifié par diice le 18/01/2014 à 13:28
bonjour le père,
merci de ta réponse.

alors avec la fonction habituelle htmlentities(), il n'encode pas le caractere en base de données... du coup j'ai bien essayé un ereg_replace() avec les deux signes, mais ca ne marche pas... (j'ai pas fait de mb_eregi_replace() parce que le site fait a l'epoque etait en php4)...
j'ai bien trouvé le code de l'apostrophe en html (je mets des espaces sinon on ne voit plus le code) :
- apostrophe droit : & #39;
- apostrophe penché : & #146; ou & rsquo;
mais ca ne marche pas :
ereg_replace("’","'",$text) // ne marche pas (1er : apostrophe penché, 2eme le droit)
ereg_replace("& #146;","& #39;",$text) // ne marche pas
ereg_replace("& rsquo;","& #39;",$text) // ne marche pas


le site est fait en iso-8859-1.
et tu verras les apostrophes penchés à cette adresse : https://www.fairesavoirfaire.com/article.php?id=713&marche=maison
(je reprécise qu'a l'affichage sur le site, ca ne me pose aucun probleme... le probleme est lors de l'envoi de l'article par newsletter...)
0
Xavierdu34 Messages postés 216 Date d'inscription lundi 2 décembre 2013 Statut Membre Dernière intervention 10 octobre 2016 21
18 janv. 2014 à 21:01
Il y a deux résolutions possibles à ton problème :

La version simple (pansement):

<?php
$string = str_replace("'","'",$string); 
?>


La version compliqué (pour que ce soit bien) :

Tu as très probablement un soucis d'encodage, et la c'est pas simple, vérifie que tous tes fichiers include ou require, sont bien dans le même encodage, déclare cet encodage dans ton entête html. Ensuite utilises les fonctions d'encodage (utf8_decode et utf8_encore par exemple) pour avoir toutes tes ressources dans le même encodage et le problème devrait disparaître.
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
18 janv. 2014 à 23:30
merci Xavier,

a priori pour l'encodage, je suis en iso-8859-1 sur toutes mes pages et mes include prennent cet encodage par defaut.

je vasi tenter avec str_replace a la place de ereg_replace().
merci encore pour ta reponse !
0
Xavierdu34 Messages postés 216 Date d'inscription lundi 2 décembre 2013 Statut Membre Dernière intervention 10 octobre 2016 21
Modifié par Xavierdu34 le 19/01/2014 à 02:43
met bien une apostrophe penchée dans le premier paramètre.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
18 janv. 2014 à 22:56
La première solution de Xavierdu34 marche (en remettant une apostrophe penchée dans le premier paramètre) et n'a rien d'un simple pansement. C'est même certainement ce que tu as de mieux à faire.

Tu n'as absolument aucun problème d'encodage au niveau de ton site proprement dit, tu n'as rien à corriger à ce niveau-là. La page est parfaitement correcte. Le problème d'encodage se situe au niveau du mail, que ce soit dans l'envoi de la newsletter, et peut-être même dans les clients mail eux-mêmes.
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
18 janv. 2014 à 23:31
ok, merci beaucoup, j'essaye ca et je reviens vous dire ce qu'il en est !
merci encore pour votre disponibilité...
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
19 janv. 2014 à 00:26
bon malheuresement, ca ne marche pas...

en cherchant un peu, j'ai reussis avec mb_convert_encoding($txt, "ISO-8859-1", 'UTF-8'); a ciblé le fameux apostrophe penché... sauf qu'il ne remplace rien du tout, il m'enleve completement l'apostrophe sans meme le remplacer par un espace, rien...
du coup ca donne par exemple : "larbre".

sinon j'ai reussi en passant en utf8, ce que je n'ai pas précisé, mais pour envoyer par mail, je suis obligé de tout mettre en utf8 (le prestataire d'emailing est fait comme ça)... du coup en fait, je dois remplacer à la finale : ' par '...
bref, ca ne change rien, avec ereg_replace ou str_replace ca ne change rien.

si vous avez une idée ? peut-etre j'utilise mal le mb_convert_encoding()...
c pourtant la seule fonction qui fait bouger un peu les choses...
0
Utilisateur anonyme
19 janv. 2014 à 08:10
Tu n'as pas de raison d'utiliser mb_convert_encoding : tes apostrophes penchées ne sont pas en utf8. Ne change pas l'encodage : il est correct.
J'ai essayé le str_replace sur ta page et il marche très bien.
L'as-tu essayé ? As-tu bien remplacé le premier paramètre par une apostrophe penchée ?
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
19 janv. 2014 à 15:17
oui oui bien sur je l'ai essayé, et c'est pourquoi je trouve bizarre que ca ne marche pas...
j'ai bien mis pourtant l'apostrophe penché (sur le forum il est automatiquement remis en droit...)
0
Xavierdu34 Messages postés 216 Date d'inscription lundi 2 décembre 2013 Statut Membre Dernière intervention 10 octobre 2016 21
19 janv. 2014 à 14:09
ou plutôt comment utilise tu le str_replace, poste nous un peu de contexte de ton code.
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
19 janv. 2014 à 15:22
en fait j'ai une fonction qui me change mon texte en fonction de :
- l'affichage sur le site
- l'envoi via une adresse modifiée dans une newletter (prestataire mailpro)

function encodeTxt($txt) {
	if ($_GET['integreted']=='ok') { // si l'adresse est pour Mailpro (newsletter) (utf8) C'est ICI QUE J'AI UN SOUCI
//		return ereg_replace(''','\'',utf8_encode($txt));
//		return mb_convert_encoding($txt, "ISO-8859-1", 'UTF-8');
//		return ereg_replace("apostrophe penché","'",utf8_encode($txt)));
	        return utf8_encode($txt); // code initial
	} else { // si c'est de l'affichage pur et dur sur le site (iso-8859-1)
		return html_entity_decode($txt);
	}
}


c'est quand je le passe en utf8, que mon apostrophe penché se transforme en : '
(d'ou la premiere cnversion dans mon code).
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
19 janv. 2014 à 17:42
je remets le code parce qu'il a tout fait sauter :
function encodeTxt($txt) {
	if ($_GET['integreted']=='ok') {
//		return ereg_replace('Â '','\'',utf8_encode($txt));
//		return str_replace('Â '','\'',utf8_encode($txt));
//		return mb_convert_encoding($txt, "ISO-8859-1", 'UTF-8');
//		return ereg_replace("apostrophe penché","'",utf8_encode($txt)));
//		return str_replace("apostrophe penché","'",utf8_encode($txt)));
		return utf8_encode($txt); // fonction initiale
	} else {
		return html_entity_decode($txt);
	}
}


c'est quand je le passe en utf8, que mon apostrophe penché se transforme en : Â ' (sans l'espace du milieu)
(d'ou la premiere cnversion dans mon code).
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
19 janv. 2014 à 17:52
En fait je vais essayer de me résumé plus clairement parce que la j'ai l'impression d'etre de plus en plus flou...

donc, mon client envoi une newsletter via MailPro où il colle dans leur administration l'adresse d'exemple suivante : http://www.fairesavoirfaire.com/newsletters/newsletter_FaireSavoirFaire_17012014_integreted

A l'origine, le site developpé il y a environ 4 ans a été fait en ISO-8859-1.
Pour envoyer cette url a MailPro je suis obligé de la mettre en utf8.

quand mon client rentre ses articles dans son admin, il fait souvent un copié coller de word, qui lui met les apostrophes en penché (dactylo).

mon souci, c'est que quand il envoit sa newsletter, certaines personnes recoivent le mails avec soit des caracteres bizarres (carré noirs), soit un espace (ex l arbre), soit sans apostrophe et sans espace (ex larbre).
et cela ne fait ca que sur les apostrophes !!!

je précise que personnelement via gmail, je recois leur newsletter sans aucun souci de ce genre !

bref, pour etre plus générique, je préfère remplacer a la base cet apostorphe penché par une droite pour éviter tout probleme de compatibilité de mail ou autre.

et mon souci, c'est que je n'arrive pas a chnager le penché par le droit...

j'ai donc essayé avec ereg_replace et avec str_replace en mettant le penche en premier, rien ne marche.
j'ai essayé avec le code html, avec chr() et avec un code genre #89a ou je sais plus trop quoi.
bref, ca ne marche pas...

voilà j'espere que j'ai mieux résumé et que cela est plus compréhensible pour vous.

extrait de code de ma page :
function encodeTxt($txt) {
	if ($_GET['integreted']=='ok') {
//		return ereg_replace('Â '','\'',utf8_encode($txt));
//		return str_replace('Â '','\'',utf8_encode($txt));
//		return mb_convert_encoding($txt, "ISO-8859-1", 'UTF-8');
//		return ereg_replace("apostrophe penché","'",utf8_encode($txt)));
//		return str_replace("apostrophe penché","'",utf8_encode($txt)));
		return utf8_encode($txt); // fonction initiale
	} else {
		return html_entity_decode($txt);
	}
}

echo encodeTxt($titre); // par exemple


merci déjà pour votre aide !
0
Utilisateur anonyme
19 janv. 2014 à 21:21
oui oui bien sur je l'ai essayé, et c'est pourquoi je trouve bizarre que ca ne marche pas..
Si, ça marche, il n'y a pas de doute là-dessus. Es-tu sûr que quand tu l'as essayé, l'éditeur de texte qui te sert à écrire ton code n'était PAS en mode utf-8 ? Peux-tu nous mettre le code avec la fonction str_replace sur cjoint.com pour vérifier l'encodage ?
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
19 janv. 2014 à 21:41
J utilise dreamweaver pour le code et j avoue que je ne sais pas en quoi il est paramétré... Mais je suis sur de voir dans mon code le bon apostrophe penché... Je fais un imprime écran et je vous envoi ça pas de souci
0
Utilisateur anonyme
19 janv. 2014 à 22:29
Nous le savons bien que tu vois l'apostrophe penchée. Ce qui compte, ce n'est pas l'image qu'on voit, mais les octets qui constituent le fichier. Car la fonction str_replace compare des octets, pas des images de caractères sur un écran. Mais même si tu écris avec dreamweaver (que je ne connais pas) tu obtiens bien un fichier qui contient ce que tu as écrit, non ?
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
19 janv. 2014 à 23:32
je n'ai pas tout compris le pere... je ne sais pas trop quoi vous envoyer...
j'ai mis carrément le fichier php ici : https://www.cjoint.com/?3AtxEayWcgZ dites moi si ca vous va
0
Utilisateur anonyme
20 janv. 2014 à 08:18
Il n'y a aucun str_replace dans le code que tui envoies. Ce que je te dis, c'est que le str_replace marche pour transformer les apostrophes penchées en apostrophes droites, alors je te demande de m'envoyer le fichier qui contient le str_replace qui, selon toi, ne marche pas.
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
20 janv. 2014 à 14:35
excuse moi, effectivement, j'ai pas envoyé la bonne version de page...
désolé !

voici la bonne https://www.cjoint.com/?3AuoINFHtLt
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
20 janv. 2014 à 15:04
Salut,

Je n'ai malheureusement pas la réponse à ton problème mais je me permet de faire une remarque concernant cette phrase : "mes textes sont soumis au htmlentities() avant l'entree en base".

La fonction htmlentities() ne devrait être utilisé que pour l'affichage des données en HTML, et surtout pas pour sécurisé tes variables pour les traitements SQL.

Ça ne corrige surement pas ton problème mais ça pourrait être une première piste d'amélioration.

Bonne journée
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
20 janv. 2014 à 15:07
merci beaucoup de ta remarque !
j'ai souvent lu ou vu des scripts avec htmlentities(), alors du coup je me dis "mince" !!
que pourrasi-je mettre pour que ce soit plus sécurisé ? htmlspecialchars() ?
(sachant qu'aujourdh'ui je suis en utf8...
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
20 janv. 2014 à 15:13
Non, même remarque que pour htmlentities(), htmlspecialchars() est faite pour l'affichage HTML (comme leurs noms l'indiquent ^^).

Pour sécurisé tes variables pour les traitements SQL, il faut utiliser (en fonction de l'extension utilisé) :
- les requêtes préparées ou PDO::quote() pour l'extension PDO
- mysqli_real_escape_string() pour l'extension MySQLi
- mysql_real_escape_string() pour l'extension MySQL

Contrairement à htmlentities() ou htmlspecialchars(), ces fonctions prennent en compte les spécificités de ton SGBD (encodage, caractères spéciaux, ...)
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
20 janv. 2014 à 15:16
d'accooord !
ben voui effectivement c'est pas bete ! tout est dans le nom...

ben ecoute a partir d'aujourd'hui, je vais m'atteler a ca!
merci en tout cas pour ta remarque ! je vais me coucher plus sécurisé :)
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
20 janv. 2014 à 15:26
merci beaucoup ca marche !!!!

alors j'ai pas tout compris sur les différents affichages de l'apostrophe, (code 146) et (unicode 0x2019 / UTF8 E2 80 99). comment as-tu pu voir ça ??

et ok pour l'utf8... je partait sur l'utf8 au depart parce que ma page avec la variable pur la newsletter est en meta utf8... je ne prenais effectivement pas le probleme dans le bon sens...

en tout cas merci beaucoup !!
ca marche nikel ! j'en connais un qui va être content :)

vraiment merci de m'avoir sorti de ce probleme !!
0
Utilisateur anonyme
20 janv. 2014 à 15:39
comment as-tu pu voir ça ??
Avec un éditeur hexadécimal, c'est à dire un programme qui te montre le contenu d'un fichier octet par octet et non pas après mise en forme. C'est le seul moyén de tout voir.
Pour te donner une idée :
https://www.cjoint.com/?0AupMsnpqv2
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
20 janv. 2014 à 15:42
ah oui d'accord !! je ne savais meme pas que ca existait, ni meme les problemes liés a ca !!
bn, ben merci de l'info, et un grand merci encore pour l'aide !! j'aurai jamais trouvé tout seul !!!

bonne journée le père !!
et encore merci vraiment !
0
Utilisateur anonyme
20 janv. 2014 à 16:13
De rien. Au plaisir :-)
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
20 janv. 2014 à 22:27
:)
0