Page 1 sur 2

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

Posté : 05 mars 2020, 08:26
par Couin
Hellooo !

Je cale sur un petit souci qui me donne du fil à retordre :(

Je ne savais pas trop où ouvrir le sujet car c'est entre du code de caractère et du php. Si besoin, ne pas hésiter à déplacer :)

Dans un formulaire, je colle par exemple un titre musical que j'ai copié depuis le site Discogs.
Prenons par exemple ce titre :
Latino Party ‎– The Party ( https://www.discogs.com/Latino-Party-Th ... ter/176999 )

On peut constater que le tiret entre l'artiste et le titre n'est pas le "tiret du 6" mais un tiret un peu plus long. Donc un caractère à priori différent.

Par un str_replace, je souhaiterait remplacer ce tirer inhabituel par "celui du 6", pour rester homogène avec les saisies que je fais manuellement.

Comment savoir quel est exactement ce caractère ?
Un copié collé dans Notepad++ me donne le même tiret que celui que je veux, dans Word, ca met le tiret long... Afficher le code source de la page ou examiner l'élément ne m'avance pas plus :(

J'ai tenté ces remplacements là :

Code : Tout sélectionner

$edit = str_replace("–", "-", $edit ); $edit = str_replace("–", "-", $edit ); $edit = str_replace("–", "-", $edit ); $edit = str_replace("—", "-", $edit ); $edit = str_replace("—", "-", $edit );
mais rien ne fonctionne :(

De manière générale, comment connaître le code d'un caractère un peu inhabituel, comme une apostrophe que l'on fait avec la touche 4 de la rangée du haut d'un clavier (ce qui donne ' ) et qui sur un tchat par exemple, devient ‘ ou une apostrophe qui descend vers la droite.

Merkouin pour le coup de palme :)
Couin

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

Posté : 05 mars 2020, 10:33
par Spols
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

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

Posté : 05 mars 2020, 11:50
par Saian
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) ?

Posté : 05 mars 2020, 14:45
par or 1
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) ?

Posté : 05 mars 2020, 16:50
par Couin
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) ?

Posté : 05 mars 2020, 17:42
par two3d


-
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) ?

Posté : 05 mars 2020, 18:56
par tesmet
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) ?

Posté : 05 mars 2020, 23:43
par Couin
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) ?

Posté : 05 mars 2020, 23:52
par or 1
$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) ?

Posté : 06 mars 2020, 00:20
par Couin
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: [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

Posté : 06 mars 2020, 13:22
par Saian
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: [RESOLU] Comment savoir quel caractère exactement (pour un str_replace) ?

Posté : 06 mars 2020, 16:23
par Couin
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) ?

Posté : 06 mars 2020, 17:01
par Saian
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) ?

Posté : 06 mars 2020, 17:52
par Couin
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) ?

Posté : 06 mars 2020, 17:59
par Saian
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. ;)