Page 1 sur 2

Conversion apostrophe

Posté : 10 févr. 2022, 20:22
par jp.bond
Bonjour à tous,
je galère sur un caractère spécial saisi à partir d'un mac dans un formulaire PHP, et qui me génère un ? quand je l'affiche au final dans un fichier PDF.
Il s'agit de l'apostrophe : pas celui là : ' mais celui là : ´
J'ai essayé de convertir le caractère dès le départ lors de la récupération des variables en POST pour le remplacer par le ' traditionnel, mais sans succès :

Code : Tout sélectionner

$nom = str_replace("´", "'", $_POST['nom']); $nom = html_entity_decode($_POST['nom'],ENT_QUOTES | ENT_HTML5); $nom = utf8_decode($_POST['nom']); $nom = html_entity_decode(htmlentities($_POST['nom']));
et ma page contient <meta charset="UTF-8">

si vous avez un idée...?

Re: Conversion apostrophe

Posté : 11 févr. 2022, 00:48
par @rthur
Si ce caractère s'affiche bien quand tu fais un echo.
Alors il s'agit d'un problème d'encodage (utf8) lors de la génération de ton PDF, ou d'un problème de police de caractères utilisé dans ton fichier PDF.

Si ce caractère ne s'affiche pas correctement lors d'un echo, alors c'est que ton serveur PHP n'est pas configuré pour de l'utf8, tu peux ajouter au début de ton script la ligne suivante pour le forcer :
header('Content-type: text/html; charset=utf-8');

Re: Conversion apostrophe

Posté : 22 févr. 2022, 19:56
par jp.bond
merci pour ta réponse, mais je suis bien en UTF-8 partout.
Le souci doit se trouver effectivement dans la conversion PDF, mais quoiqu'il en soit, j'aimerai remplacer l'apostrophe courbe par un apostrophe normal, dès le départ à la sortie de mon formulaire, comme ça le problème est réglé... mais aucune de ces conversions ne semblent fonctionner :
$nom = str_replace("´", "'", $_POST['nom']);
$nom = html_entity_decode($_POST['nom'],ENT_QUOTES | ENT_HTML5);
$nom = utf8_decode($_POST['nom']);
$nom = html_entity_decode(htmlentities($_POST['nom']));
$nom = iconv('UTF-8', 'windows-1252', $_POST['nom']);
$nom = str_replace(chr(180), chr(39), $_POST['nom']);
$nom = str_replace(chr(146), chr(39), $_POST['nom']);
$nom = str_replace(chr(180), "'", $_POST['nom']);

Re: Conversion apostrophe

Posté : 24 févr. 2022, 16:54
par jp.bond
up ?

Re: Conversion apostrophe

Posté : 24 févr. 2022, 20:52
par ynx
Bonjour,

La fonction str_replace() ne fonctionne pas correctement si les chaines n'utilisent pas le même encodage.
Je pense que le problème vient de là mais je ne m'y connais pas assez pour donner une réponse précise (et surtout ne pas dire de bêtises).

Voici mon fichier de test pour essayer de reproduire ton problème, en espérant que ça puisse te mettre sur une piste (le fichier est encodé en UTF-8 sans BOM, le charset par défaut défini dans la configuration de PHP est aussi UTF-8) :
<?php

$phpVar = '´';

if (isset($_POST['nom'])) {
    echo '<pre>';
    echo 'Charset par défaut de PHP : ' . ini_get('default_charset') . PHP_EOL;

    echo 'La variable PHP est encodé en ' . mb_detect_encoding($phpVar) . PHP_EOL;
    echo 'La variable $_POST[nom] est encodé en ' . mb_detect_encoding($_POST['nom']) . PHP_EOL;

    echo 'Replace : ' . str_replace($phpVar, '"', $_POST['nom']) . PHP_EOL;
    echo '</pre>';
}

?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <form method="post">
        <input type="text" name="nom" value="´test´">
        <input type="submit" value="Submit UTF8">
    </form>

    <form method="post" accept-charset="ISO-8859-1">
        <input type="text" name="nom" value="´test´">
        <input type="submit" value="Submit ISO">
    </form>
</body>
</html>


Re: Conversion apostrophe

Posté : 16 mai 2022, 10:29
par jp.bond
ok j'aimerais simplifier le problème... car il est toujours présent
Au lieu de tenter de comprendre pourquoi cela ne fonctionne pas lors de mon passage en PDF, j'aimerais régler le soucis à la source.
Déjà, ça me rend fou que le sigle apostrophe ne soit pas le même sur un clavier PC et sur un clavier MAC.
Vu qu'il me semble que la norme c'est que l'apostrophe soit celui là : ' (alors que sur un mac c'est celui là : ´ )
Et que j'ai pas envie d'avoir des ' et des ´ dans ma base de données, alors le plus simple serait que dès le départ, dans mon fichier PHP, je convertisse au moment de l'enregistrement des données issus de mon formulaire toutes les fois que ´ est saisi, je le remplace par ' tout de suite !
Est ce que vous pouvez m'aider à faire cela ?

Re: Conversion apostrophe

Posté : 16 mai 2022, 10:53
par jp.bond
Apparemment, le bon nom c'est l'apostrophe courbe (à la française) vs apostrophe droit (anglais)
l'apostrophe droit marche très bien, et c'est l'apostrophe courbe que j'essaie d’itentifier pour le remplacer

Re: Conversion apostrophe

Posté : 16 mai 2022, 11:02
par two3d
Lorsqu'une touche est touchée dans le textarea (tu peut l'observer avec un écouteur d'événement en javascript), tu remplace ´ par ' avec replace() de JS.

Mais c'est pas la meilleure solution car ´ ne sera pas le seul caractère qui va te poser souci (pour le moment oui mais plus tard peuvent en arriver d'autres).

Sur Firefox, par exemple le correcteur d'orthographe n'a pas non plus ' ni ´ mais ’ :mrgreen:

Re: Conversion apostrophe

Posté : 16 mai 2022, 11:25
par jp.bond
Mais pourquoi je ne peux pas ou je n'arrive pas faire fonctionner le remplacement d'un caractère par un autre en PHP ?
J'ai l'impression que c'est juste parce que je n'arrive pas à cibler le bon caractère, non ?
j'ai donc besoin d'identifier ce caractère...

Au lieu d'aller à taton avec :
$nom = str_replace("´", "'", $_POST['nom']); >> déjà, ça, je ne comprends pas pourquoi ça marche pas !
$nom = html_entity_decode($_POST['nom'],ENT_QUOTES | ENT_HTML5);
$nom = utf8_decode($_POST['nom']);
$nom = html_entity_decode(htmlentities($_POST['nom']));
$nom = iconv('UTF-8', 'windows-1252', $_POST['nom']);
$nom = str_replace(chr(180), chr(39), $_POST['nom']);
$nom = str_replace(chr(146), chr(39), $_POST['nom']);
$nom = str_replace(chr(180), "'", $_POST['nom']);

Comment faire pour savoir réellement comment cibler ´ ?

Re: Conversion apostrophe

Posté : 16 mai 2022, 11:30
par jp.bond
Pourtant c'est simple il me semble...
Je saisis ça dans mon formulaire : L’ARBRE (avec apostrophe courbe)
j'applique cette fonction : $nom = str_replace("´", "'", $_POST['nom']);
Je voudrais obtenir ça après enregistrement : L'ARBRE (avec apostrophe droit)

Re: Conversion apostrophe

Posté : 16 mai 2022, 11:47
par two3d
str_replace("´", "'", "´´´´") == "C:\wamp64\www\test.php:9:string '''''' (length=4)"
Ça fonctionne parfaitement de mon côté.

Tu utilise quoi comme logiciel ?
Ton fichier est il en UTF8 sans BOM ?

Fait un var_dump de ton $_POST['nom'] pour savoir ce qu'il contient réellement.

Re: Conversion apostrophe

Posté : 16 mai 2022, 12:29
par jp.bond
je t'avoue que je ne comprends plus rien...
bon, d'abord, je viens encore de vérifier avec Notepad++ et mes fichiers sont bien en encodage UFT-8 (et donc pas en UFT-8-BOM)
Ensuite, j'ai une page où j'affiche le nom en question, et JE VOIS : C'O’LIN (j'ai fait exprès d'écrire comme ça, pour voir la différence entre ' et ’ ce qui est finalement pas si évident.
Donc j'ai bien en premier ' et ensuite ’
Comme tout ce code était au sein d'une structure plus complexe, j'ai voulu isoler le problème pour faire des tests.
Donc j'ai pris mon exemple, et je voulais le tester dans un fichier simple du genre :

Code : Tout sélectionner

$nom = "C'O’LIN"; echo $nom.'<br>'; $nom = str_replace("´", "'", $nom); echo $nom;
pour pouvoir comparer...

Sauf que (truc de fou), quand je copie-colle cette valeur C'O’LIN dans mon fichier php de test, c'est C'O'LIN qui s'affiche !
Le ’ a été remplacé par ' au copié-collé !

du coup j'ai :

Code : Tout sélectionner

$nom = "C'O'LIN"; echo $nom.'<br>'; $nom = str_replace("´", "'", $nom); echo $nom;
donc évidemment que ça ne va rien changer

donc j'en déduis que ’ != ´ (ce qui est utilisé dans mon str_replace)
mais pourtant ’ != ' (en tout cas visuellement ça l'est !)

et si je fais :
$nom = str_replace("’", "'", $nom);
mais qu'au moment de faire le copié collé dans mon fichier php ça devient :
$nom = str_replace("'", "'", $nom);
ça ne va pas fonctionner non plus...

bref, je suis perdu et je ne comprends pas pourquoi j'ai une différence visuelle, mais pas vraiment au niveau du code

Re: Conversion apostrophe

Posté : 16 mai 2022, 12:48
par two3d
Sauf que (truc de fou), quand je copie-colle cette valeur C'O’LIN dans mon fichier php de test, c'est C'O'LIN qui s'affiche !
Le ’ a été remplacé par ' au copié-collé !
"dans mon fichier php de test" dans notepad++ ?

Re: Conversion apostrophe

Posté : 16 mai 2022, 13:19
par jp.bond
tu as raison !!
c'est dans Dreamweaver !
en reprenant la même chose dans Notepad++, ça passe !
Merde ! Alors ça viendrait de Dreamweaver cette galère depuis tout ce temps ?
Pourtant, c'est tellement pratique de travailler avec Dreamweaver pour la gestion de l'ensemble des fichiers...
Ou alors il y a un paramétrage que je dois pouvoir changer dans Dreamweaver pour ne plus avoir ce genre de soucis ?

Re: Conversion apostrophe

Posté : 16 mai 2022, 13:21
par jp.bond
j'ai trouvé... j'avais une fonction cochée dans les paramètres Dreamweaver qui passaient les guillemets typographiques en guillemets droits !