[RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

Re: [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

par Couin » 06 mars 2020, 18:02

J'essaierais d'être plus vigilant à l'avenir lol
Et puis ça servira peutêtre à d'autres personnes.

Re: [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

par Saian » 06 mars 2020, 17:59

Héhé merci pour le point. ^^
A noter aussi que le default charset de php peut entrer en jeu notamment avec le str_replace si le default charset ne correspond pas au charset de la chaîne. ;)

Re: [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

par Couin » 06 mars 2020, 17:52

Si je rajoute
<? header('Content-Type: text/html;charset=UTF-8'); ?>
tout en début de page de test ou
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
dans la balise head de cette même page de test, j'obtiens bien la même chose que toi :
Latino Party ‎:p The Party
 [ --- ] 
=> 32
� => 226
� => 128
� => 142
� => 226
� => 128
� => 147
=> 32
 [ --- ] 
chr(150) = �

Du coup je me dis que le problème doit être dans ma page de départ.
A noter que, information que je n’avais pas précisé, pensant que ca n'aurait pas d'importance, je traite mon form avec du JS/Ajax/json :
Lorsque je saisis un titre, un event "oninput" appelle une fonction qui ramasse la valeur du champs, l'envoie en Ajax à une page qui s'occupe de mettre les initiales en majuscules, remplacer le tiret discogs au cas où j'ai fais un copier/coller, etc etc, qui la retourne sous forme de tableau json pour actualiser la valeur du champs.
J’avais pourtant mis le
header('Content-Type: text/html;charset=UTF-8'); 
mais il se trouve que ca ne fonctionnait pas certainement à cause du json. Du coup, je teste au culot :
header('Content-Type: text/json; charset=UTF-8');
Et là ca fonctionne. Je pensais pas qu'on pouvait combiner json et charset. J'aurais au moins appris quelques trucs et du coup tu as aussi le point :D

Merkouin !

Re: [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

par Saian » 06 mars 2020, 17:01

Moi j'obtiens bien ça en utilisant ta boucle suite au submit (encore la même suite de bytes) :
L => 76
a => 97
t => 116
i => 105
n => 110
o => 111
=> 32
P => 80
a => 97
r => 114
t => 116
y => 121
=> 32
� => 226
� => 128
� => 142
� => 226
� => 128
� => 147
=> 32
T => 84
h => 104
e => 101
=> 32
P => 80
a => 97
r => 114
t => 116
y => 121

Ce qui est marrant dans ton cas c'est que tu obtiens tout de même cette suite &#8206;–, c'est comme si la chaîne d'origine avait été transformée.
J'obtiens quelque chose de similaire en faisant un htmlentities :
Latino Party &lrm;&ndash; The Party
D'après wikipedia &#8206; est une left to right mark, suivi d'un tiret de valeur 150 qui en ascii étendue est sensé être un û (mais s'affiche en – sur ta page qui bien entendu n'est pas en ascii).
https://en.wikipedia.org/wiki/Left-to-right_mark
https://www.commfront.com/pages/ascii-chart

Dans ma page affichée en utf-8 :
echo 'chr(150) = '.chr(150).'<br/>';
// chr(150) = �

Moi je suis sous mac os, peut être que le copier ou le coller dans Windows transforme la chaîne originale, mais... le résultat que tu obtiens est quand même étrange du moment ou le replace avec chr(226).chr(128).chr(142).chr(226).chr(128).chr(147) fonctionne alors même que quand tu décomposes la chaîne tu n'obtiens pas la même suite de bytes (38, 35, 56, 50, 48, 54, 59, 150). Ça ne devrait pas fonctionner.
Il y a donc à priori quelque chose qui ne colle pas dans ta méthodologie de tests.

A noter que la font utilisée peut aussi influencer les résultats affichés.

Re: [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

par Couin » 06 mars 2020, 16:23

Salut Saian,

Je n'ai pas Phpstorm mais seulement Notepad++ , peut être que ça vient de là, qu'au moment du copier coller de ce rogntudjuuuu de tiret dans le str_replace, ça le colle en tant que "tiret de je ne sais pas quoi" * ?

Car j'ai beau tester et retester, rien à faire :(
Voici le code test basé sur le tien :

Code : Tout sélectionner

<html> <head> <title>Tiret Discogs</title> <head></head> <body> <form method="post"> <input type="text" name="title" value=""/> <input type="submit" value="submit"/> </form> <?php if (isset($_POST['title'])) echo str_replace('‎–', ':p', $_POST['title']); ?> </body> </html>
Si je colle Latino Party ‎– The Party dans le champs et que je submit, ça remplace pas le tiret.
* Le tiret dans str_replace est certainement vu en tant qu'un autre tiret car si je mets pic - poc (avec le tiret du 6) dans le champs, ça remplace pas non plus.

Pour le ‎– , c'est en regardant la correspondance de chaque chr(xxx) dans une table ASCII (que je n'arrive même pas à retrouver pfff) sur le net. Mais possible que ce soit une table ascii étendue. Je suis nul en jeux de caractères, toujours trouvé ça bordélique, et la preuve encore ici :(

Pour la suite de bytes, bon, là non plus, je comprends rien :(
J'ai tenté ce code à la suite du form:

Code : Tout sélectionner

<?php if (isset($_POST['title'])) { for ( $pos=0; $pos < strlen($_POST['title']); $pos ++ ) { $byte = substr($_POST['title'], $pos, 1); echo $byte . ' => ' . ord($byte) . "<br>"; } } ?>
Et j'obtiens pas la même chose pour ce qui gravite autour de cet en...é de tiret :

Code : Tout sélectionner

L => 76 a => 97 t => 116 i => 105 n => 110 o => 111 => 32 P => 80 a => 97 r => 114 t => 116 y => 121 => 32 & => 38 # => 35 8 => 56 2 => 50 0 => 48 6 => 54 ; => 59 – => 150 => 32 T => 84 h => 104 e => 101 => 32 P => 80 a => 97 r => 114 t => 116 y => 121
Pige rien :(

Re: [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

par Saian » 06 mars 2020, 13:22

Alors tu m'excuseras Couin mais si on compte les points ce que je t'ai dit fonctionne très bien aussi, j'ai vérifié !
echo $title = "Latino Party ‎– The Party";
echo str_replace('‎–', ':p', $title);
// Latino Party ‎– The Party
// Latino Party :p The Party
PS : ceci dit l'approche de or 1 est intéressante.

EDIT et je l'ai testé en post aussi avec copié/collé du titre depuis le site sans souci, j'ai même pas mis le charset (je travaille en utf-8 avec PhpStorm et Firefox).
<form method="post">
  <input type="text" name="title" value="<?php echo $_POST['title'] ?? '' ?>"/>
  <input type="submit" value="submit"/>
</form>
<?php
if (isset($_POST['title']))
  echo str_replace('‎–', ':p', $_POST['title']);

PPS : j'ai copié le titre complet dans PhpStorm puis j'ai sélectionné le tiret (le caractère visible puis une sorte d'octet invisible) que j'ai collé dans le str_replace. Apparemment il y a plus de deux octets d'après la boucle de or 1 (y en aurait 6) mais PhpStorm le gère comme ça et ça fonctionne très bien.

Cependant, j'avoue ne pas du tout comprendre comment tu es arrivé à cette chaîne là ?
Car si je regarde une table ASCII :
Sauf que la chaîne n'est pas en ASCII mais en utf-8. Le tiret long n'existe pas en ASCII. Et d'ailleurs la table ASCII de base ne contient aucun caractère accentué, pas plus que de symbole monétaire à part le $. Il faut aller taper dans la table ASCII étendue pour trouver des caractères accentués et je n'y ai pas vu de symbole €...

L'ASCII étendu encode 256 caractères la où l'utf-8 peut en encoder plus d'un million.

Je pense que la chaîne que tu obtiens (‎–) correspond à un affichage ISO-8859-1 ou similaire. Si tu passes l’affichage en utf-8 tu obtiendras bien le fameux –.

or 1 a obtenu cette suite de byte values en lisant la chaîne octet par octet (avec le for) et en utilisant la fonction ord qui permet d'obtenir la byte value de l'octet (un byte ou octet = 8 bits, 1 bit est égal à 0 ou 1, soit 2^8 valeurs pour 1 byte, soit 256 valeurs de byte de 0 à 255).

Avec cette boucle on voit bien que le – est composé de 6 octets (226, 128, 142, 226, 128, 147) correspondant aux 6 caratcères ‎– en ISO-8859-1 et au – en utf-8 :
L => 76
a => 97
t => 116
i => 105
n => 110
o => 111
  => 32
P => 80
a => 97
r => 114
t => 116
y => 121
  => 32
? => 226
? => 128
? => 142
? => 226
? => 128
? => 147
  => 32
T => 84
h => 104
e => 101
  => 32
P => 80
a => 97
r => 114
t => 116
y => 121

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par Couin » 06 mars 2020, 00:20

Yop !

Le point est pour Or 1 :)

En adaptant :

Code : Tout sélectionner

$edit = str_replace(chr(226).chr(128).chr(142).chr(226).chr(128).chr(147), "-", $edit);
Le tiret de discogs est bien remplacé par un "tiret du 6" .

Cependant, j'avoue ne pas du tout comprendre comment tu es arrivé à cette chaîne là ?
Car si je regarde une table ASCII :

Code : Tout sélectionner

chr(226).chr(128).chr(142).chr(226).chr(128).chr(147)
me donne :

Code : Tout sélectionner

‎–

Merkouin !

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par or 1 » 05 mars 2020, 23:52

$s = "Latino Party ‎– The Party ";
for($i=0; $i < strlen($s); $i++){
	echo ord($s[$i])." =>".$s[$i]."<br/>";
}

echo str_replace(chr(226).chr(128).chr(142).chr(226).chr(128).chr(147), "|", $s)." -> $s<br/>";

$s = "Latino Party - The Party ";
for($i=0; $i < strlen($s); $i++){
	echo ord($s[$i])." =>".$s[$i]."<br/>";
}

echo str_replace(chr(45), "|", $s)." -> $s<br/>";
ça marche bien, avec un copier coller du site :
if(isset($_POST['s'])){	
	$s = $_POST['s'];
	for($i=0; $i < strlen($s); $i++){
		echo ord($s[$i])." =>".$s[$i]."<br/>";
	}

	echo str_replace(chr(226).chr(128).chr(142).chr(226).chr(128).chr(147), "|", $s)." -> $s<br/>";
}

echo '<form method="post"><input type="text" name="s"></form>';

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par Couin » 05 mars 2020, 23:43

Re,

J'ai beau tester tout un tas de trucs, rien de rien ne fonctionne :(
C'est vraiment une saleté ce tiret à la noix :evil:

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par tesmet » 05 mars 2020, 18:56

Peut-être transposé en utf8 par le navigateur? &ndash; semble être la séquence utf8 E28093 en hexadécimal.
 
$edit = str_replace(['&#x2013;', '&#8211', '&ndash;', "\xE2\x80\x93"], '-', $edit);

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par two3d » 05 mars 2020, 17:42



-
trouvé sur https://fr.wikipedia.org/wiki/Tiret
si ça peut aider, car c'est vrai que le copier/coller du tiret sur la page discogs fonctionne comme le tiret du 6

pour alléger le code, tu peux utiliser un array dans str_replace:

Code : Tout sélectionner

str_replace(['&tiret1;','&tiret2;'],"-",$str);

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par Couin » 05 mars 2020, 16:50

Salut à tous , merci pour vos réponses :)
En regardant le code source de la page discogs, je vois que ton tiret spécial se trouve en tithre H1 mais si tu cherche depuis la balise title tu as un tiret normale même si tu dois enlever la partie finale après un |

tu peux aussi voir dans les balise meta pour trouver ce qu'il te faut
J'avais mal regardé le code source de la page mais en regardant un peu plus en détail je vois

Code : Tout sélectionner

<h1 id="profile_title" class="hide_mobile has_action_menu" > <span> <span title="Latino Party" > <a href="/artist/18042-Latino-Party">Latino Party</a></span> </span> &lrm;&ndash; <span> The Party </span> </h1>
Il semblerait que le tiret soit &lrm;&ndash;
En mettant

Code : Tout sélectionner

$edit = str_replace("&lrm;&ndash;", "-", $edit );
Ca ne change rien :(
Pour les métas, oui en effet dans celle du titre on a le bon tiret, mais l'idée de base était surtotu de gagner du temps en copiant collant depuis le site au lieu de saisir à la main. Si il faut aller fouiller dans le code source à chaque fois ça risque de prendre au final plus de temps :oops: lol
A la limite autant copier coller et corriger le tiret incorrect après coup.
Salut Couin, si tu colles le titre dans un formulaire à toi, normalement il te suffit de copier le tiret et de le coller dans le str_replace. Si tu utilises bien le même encodage pour ton fichier php que la meta charset déclarée, ça devrait fonctionner tout seul si le tiret est vraiment différent.
Salut Saian :)
Tout est en UTF-8 au niveau encodage, et quand je colle le tiret (dans notepad++) dans le str_replace, bah ça met le "tiret du 6", ah bah le str_replace ne fait rien.
https://www.php.net/manual/fr/function.ord.php pour récupérer le nombre correspondant au caractère
https://www.php.net/manual/fr/function.chr.php pour le str_replace
Alors le ord me retourne 226 pour le tiret de discogs, et 45 pour le "tiret du 6".
En faisant :

Code : Tout sélectionner

$edit = str_replace(chr(226),"-",$edit);
Ca me supprime toute la chaîne dès qu'il y a le tiret de discogs dans la chaîne.

Je ne comprends rien, et pourquoi ils ont été foutre ce tiret à la con là :(

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par or 1 » 05 mars 2020, 14:45

https://www.php.net/manual/fr/function.ord.php pour récupérer le nombre correspondant au caractère
https://www.php.net/manual/fr/function.chr.php pour le str_replace

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par Saian » 05 mars 2020, 11:50

Salut Couin, si tu colles le titre dans un formulaire à toi, normalement il te suffit de copier le tiret et de le coller dans le str_replace. Si tu utilises bien le même encodage pour ton fichier php que la meta charset déclarée, ça devrait fonctionner tout seul si le tiret est vraiment différent.

Re: Comment savoir quel caractère exactement (pour un str_replace) ?

par Spols » 05 mars 2020, 10:33

En regardant le code source de la page discogs, je vois que ton tiret spécial se trouve en tithre H1 mais si tu cherche depuis la balise title tu as un tiret normale même si tu dois enlever la partie finale après un |

tu peux aussi voir dans les balise meta pour trouver ce qu'il te faut