[résolu] strtr renvoie des caractères farfelus (UTF-8)

strtr renvoie des caractères farfelus (UTF-8) [résolu] - PHP - Programmation

Marsh Posté le 06-10-2009 à 18:10:15    

J'utilise la fonction strtr pour donner un nom à mes forums à partir du sujet.
Exemple :
 - sujet = Quel temps fait-il aujourd'hui ?
 - dossier du sujet = quel_temps_fait_il_aujourd_hui__
 
Avec les accents (é, à, è, etc.), la fonction suivante me renvoie des caractères farfelus.
Exemple :
 - é devient a_
 - à devient a_
 - etc.
 

Code :
  1. // On enlève les accents
  2. $dossier = $sujet;
  3. $dossier = strtr($dossier,
  4. 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
  5. 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
  6. // Remplacer les caracteres autres que lettres et chiffres par _
  7. $dossier = preg_replace('/([^a-z0-9]+)/i', '_', $dossier);
  8. // Remplacer les majuscules par des minuscules
  9. $dossier = strtolower($dossier);


 
Quel est le problème ? J'utilise le jeu de caractères UTF-8


Message édité par alx067 le 07-04-2010 à 20:56:04
Reply

Marsh Posté le 06-10-2009 à 18:10:15   

Reply

Marsh Posté le 07-10-2009 à 10:20:34    

Justement strtr va prendre tes caractères comme de l'ISO, donc ça va péter. Genre si tu fais juste :

Code :
  1. strtr($dossier, 'é', 'e');


strtr va le voir comme ça :

Code :
  1. strtr($dossier, 'é', 'e');


Du coup *boom*.

 

Il faut utiliser un tableau :

Code :
  1. strtr($dossier, array(
  2. 'À' => 'A',
  3. ...
  4. 'é' => 'e',
  5. ...
  6. 'ÿ' => 'y'));


Message édité par FlorentG le 07-10-2009 à 10:20:49
Reply

Marsh Posté le 10-10-2009 à 15:08:21    

J'ai tenté avec ce bout de code :  

Code :
  1. $f = strtr($f, array("é"=>"e","è"=>"e" ));


 
Mais rien ne se passe...
 
J'ai certainement fait une erreur.


Message édité par alx067 le 10-10-2009 à 15:35:23
Reply

Marsh Posté le 26-10-2009 à 16:05:42    

Quelqu'un ?
 
 :??:

Reply

Marsh Posté le 27-10-2009 à 14:12:53    

http://www.weirdog.com/blog/php/su [...] n_php.html


Message édité par stealth35 le 27-10-2009 à 14:13:04
Reply

Marsh Posté le 03-11-2009 à 15:26:15    

Je vais voir çà ce soir...

Reply

Marsh Posté le 03-11-2009 à 18:09:40    

alx067 a écrit :

Je vais voir çà ce soir...


 
 
penser aussi aux format d'encodage avant de faire ton script :
 
utf8_encode()
utf8_decode()
 
ou dans les fonctions :
exemple pour htmlentities()
 
htmlentities($string),
 devient pour le mettre en utf8  
htmlentities($string, ENT_QUOTES, 'utf-8'); (je crois)
 
bref il doit avoir les meme attributs de fonction avec strtr...

Reply

Marsh Posté le 11-11-2009 à 16:24:29    

utf8_encode() et utf8_decode() renvoient des caractères farfelus qui n'ont rien à voir avec UTF-8 (hébergeur Free), et htmlentities avec les spécifications utf-8 renvoie de ISO courant...
 
Je persévère

Reply

Marsh Posté le 11-11-2009 à 16:41:40    

verifie bien l'encodage natifs des fichiers

Reply

Marsh Posté le 11-11-2009 à 17:08:45    

L'entête des page est en UTF-8 :  

Code :
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


et j'ai rajouté cette ligne pour le PHP

Code :
  1. <?php
  2. header('Content-type: text/html; charset=UTF-8');
  3. ?>

Message cité 1 fois
Message édité par alx067 le 11-11-2009 à 17:09:52
Reply

Marsh Posté le 11-11-2009 à 17:08:45   

Reply

Marsh Posté le 11-11-2009 à 17:11:50    

Normal à ISO (htmlentities):
é --> &eacute;
 
Normal à UTF-8 (?):
é --> &#233;
 
ISO à UTF-8 (?):
&eacute; --> &#233;


Message édité par alx067 le 11-11-2009 à 17:17:42
Reply

Marsh Posté le 11-11-2009 à 17:32:25    

alx067 a écrit :

L'entête des page est en UTF-8 :  

Code :
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


et j'ai rajouté cette ligne pour le PHP

Code :
  1. <?php
  2. header('Content-type: text/html; charset=UTF-8');
  3. ?>



 
meme, si ton fichier est encoder en ansi a la base, ca va foutre la merde, regarde dans ton editeur qu'elle encodage a ton fichier, apres si tu travail avec mysql, c'est pareil faut verifié que la connexion est en utf8 et que tes table soit en utf8, il suffis que y'en est un qui diffère dans l'histoire pour que ca marche pas

Reply

Marsh Posté le 11-11-2009 à 18:25:45    

D'autres problèmes
 

Code :
  1. $sujet = "ééééé";
  2. echo "$sujet<br />";
  3. $dossier = strtr($sujet,
  4. 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
  5. 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
  6. echo "$dossier<br />";


 
Affiche :  
ééééé
y�y�y�y�y�


Message édité par alx067 le 11-11-2009 à 18:26:11
Reply

Marsh Posté le 11-11-2009 à 20:12:03    

t'avai té voir la technique pour enlevé les accent  dans le liens que je t'ai passé ?

Reply

Marsh Posté le 11-11-2009 à 21:13:23    

Je suis allé, mais le résultat me sort des caractères farfelus (A�A�A�A�A�A�A�A�A�A�)...
 
J'y arrive avec une autre méthode...

Code :
  1. <?php
  2. $remplacements = array(
  3. " " => "_",
  4. "!" => "_",
  5. '"' => "_",
  6. "#" => "_",
  7. "$" => "_",
  8. "%" => "_",
  9. "&" => "_",
  10. "'" => "_",
  11. "(" => "_",
  12. " )" => "_",
  13. "*" => "_",
  14. "+" => "_",
  15. "," => "_",
  16. "-" => "-",
  17. "." => "_",
  18. "/" => "_",
  19. ":" => "_",
  20. ";" => "_",
  21. "<" => "_",
  22. "=" => "_",
  23. ">" => "_",
  24. etc....
  25. );
  26. $f = strtr($f, $remplacements);
  27. ?>


 
Cependant au-delà d'un certanim nombre de données, les caractères sont mals ou pas remplacés...


Message édité par alx067 le 11-11-2009 à 22:30:33
Reply

Marsh Posté le 12-11-2009 à 14:16:04    

Où pourrais je trouver un spécialité des conversion ISO, UTF-8 ?
 
SVP, là je cale...

Reply

Marsh Posté le 12-11-2009 à 14:26:58    

Tu as vérifié l'encodage de tes fichiers !??


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 12-11-2009 à 14:27:51    

Ouais y'a un problème d'encodage de fichiers là, il faut qu'ils soient en utf-8 aussi

Reply

Marsh Posté le 12-11-2009 à 14:29:20    

marche tres bien ca moi

Code :
  1. function remove_accents($str, $charset='utf-8')
  2.     {
  3.         $str = htmlentities($str, ENT_NOQUOTES, $charset);
  4.         
  5.         $str = preg_replace('#\&amp;([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $str);
  6.         $str = preg_replace('#\&amp;([A-za-z]{2})(?:lig)\;#', '\1', $str);
  7.         $str = preg_replace('#\&amp;[^;]+\;#', '', $str);
  8.         
  9.         return $str;
  10.     }
  11.     
  12.     $str = 'éééééééééé';
  13.     
  14.     echo remove_accents($str);


Message édité par stealth35 le 12-11-2009 à 14:34:45
Reply

Marsh Posté le 12-11-2009 à 14:33:12    

Moi j'ai un truc du style :

Code :
  1. $url =
  2.      preg_replace('/-{2,}/', '-',
  3.      preg_replace('/[^a-z0-9-_]/', '',
  4.      str_replace(array(' ', ',', ':', ';', '/', '\'', '\\'), '-',
  5.      strtolower(
  6.      iconv('utf-8', 'us-ascii//TRANSLIT',
  7.      iconv('utf-8', 'utf-8//IGNORE', $str))))));


Message édité par FlorentG le 12-11-2009 à 14:33:56
Reply

Marsh Posté le 12-11-2009 à 14:37:22    

Je verrais çà ce soir...
 
Merci, parce que là je désespère.


Message édité par alx067 le 12-11-2009 à 14:37:46
Reply

Marsh Posté le 12-11-2009 à 14:37:34    

sinon pour ceux qui veulent pas se faire chié
 

Code :
  1. filter_var($url, FILTER_SANITIZE_URL);

Reply

Marsh Posté le 12-11-2009 à 14:38:44    

filter_var garde trop de trucs [:sadnoir]

Reply

Marsh Posté le 12-11-2009 à 14:40:51    

FlorentG a écrit :

filter_var garde trop de trucs [:sadnoir]


 
oui mais t'as une url valide, apres c'est sur c'est moins joli

Reply

Marsh Posté le 12-11-2009 à 14:47:00    

En réalité, il me faudrait les fonctions suivantes :  
 
Normal --> UTF-8
ISO --> UTF-8
Normal --> "normal sans accents, sans majuscules sans espaces, sans ponctuations et avec un nombre de caractères limités" (pour le nom des dossiers et fichiers)
UTF-8 --> Normal
UTF-8 --> "Normal sans accents" (problème d'affichage dans certains logiciels)
 
J'utilisais les fonctions strtr et strtr_replace mais elle renvoie parfois des caractères "farfelus". Je cherche des fonctions stables, rapides et fonctionne sous différents hébergeurs pour un site qui me servira d'architecture.
 
 
Au cas où un génie des charsets passe par ici.


Message édité par alx067 le 12-11-2009 à 14:48:39
Reply

Marsh Posté le 12-11-2009 à 14:47:51    

Normal ça existe pas :o Quelle différence entre normal et iso ? Tu veux peux-être dire ASCII ?

Reply

Marsh Posté le 12-11-2009 à 14:51:04    

Oui (normal = différence ; ASCII = différence)
 
 :D


Message édité par alx067 le 12-11-2009 à 14:54:17
Reply

Marsh Posté le 14-11-2009 à 19:49:22    

J'ai essayé vos solutions, sans succés...
J'ai toujours les mêmes caractères farfelus... (éé)
[:creal]
 
Un autre point de détails... Au cours de mes lectures j'ai fait la découverte de "UTF-8" et "UTF-8 sans BOM" pour le format des pages PHP.
Quelle est la différence ?
 
Pour le reste, je suis ouvert à tous vos conseils...


Message édité par alx067 le 14-11-2009 à 19:55:25
Reply

Marsh Posté le 17-11-2009 à 13:29:19    

stealth35 a écrit :

verifie bien l'encodage natifs des fichiers


stealth35 a écrit :


 
meme, si ton fichier est encoder en ansi a la base, ca va foutre la merde, regarde dans ton editeur qu'elle encodage a ton fichier, apres si tu travail avec mysql, c'est pareil faut verifié que la connexion est en utf8 et que tes table soit en utf8, il suffis que y'en est un qui diffère dans l'histoire pour que ca marche pas


kao98 a écrit :

Tu as vérifié l'encodage de tes fichiers !??


FlorentG a écrit :

Ouais y'a un problème d'encodage de fichiers là, il faut qu'ils soient en utf-8 aussi


 
Tu le fais exprès ou quoi ?


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 07-04-2010 à 20:54:14    

OK, j'ai réussi à me dépatouiller avec les encodages.
1. J'utilise Notepad ++ et choisi l'encodage souhaité dans les options d'encodage (UTF-8 semble être la meilleure solution, il existe plus puissant mais plus lent ; UTF-16 et UTF-32). Il fallait préciser où définir l'encodage (en ligne de commande, dans l'éditeur de texte, dans le code PHP, dans le code HTML)...!
2. L'affichage de mes codes est maintenant correcte. Penser à indiquer le charset utilisé dans l'en-tête  HTML (exemple : <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=utf-8"> )
 
Désolé pour le retard, le problème est résolu.
 
Un lien utile est certainement connu : http://electron-libre.fassnet.net/utf8.php (en bas de page)


Message édité par alx067 le 07-04-2010 à 20:58:53
Reply

Marsh Posté le 13-04-2010 à 21:29:43    

En tout cas jusque la sortie officielle de PHP 6, le noyau de PHP travaille en ISO. J'ai eu le même problème. Il faut juste donner des variables ISO en entrées que tu pourras remettre en utf8 par la suite pour que ce soit transparent.

Message cité 1 fois
Message édité par the_bigboo le 13-04-2010 à 21:29:51
Reply

Marsh Posté le 14-04-2010 à 10:10:35    

the_bigboo a écrit :

En tout cas jusque la sortie officielle de PHP 6, le noyau de PHP travaille en ISO. J'ai eu le même problème. Il faut juste donner des variables ISO en entrées que tu pourras remettre en utf8 par la suite pour que ce soit transparent.


 
PHP6 c'est abandonnée  :sweat:

Reply

Marsh Posté le 14-04-2010 à 16:19:18    

Tu tiens ça d'ou ?

Reply

Marsh Posté le 14-04-2010 à 16:31:22    

Reply

Marsh Posté le 14-04-2010 à 17:56:02    

stealth35 a écrit :

PHP6 c'est abandonnée  :sweat:


L'implémentation UTF8 telle que prévue est abandonnée [:aloy]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 14-04-2010 à 20:09:03    

drasche a écrit :


L'implémentation UTF8 telle que prévue est abandonnée [:aloy]


 
oui, elle est dans une autre branch, et de ce fait la branch php6 n'existe plus  
http://svn.php.net/repository/php/php-src/branches/

Reply

Marsh Posté le 14-04-2010 à 20:34:11    

Je connais les détails techniques de l'histoire :o
 
Et elle existera à nouveau, c'est juste temporaire.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 14-04-2010 à 20:49:41    

drasche a écrit :

Je connais les détails techniques de l'histoire :o
 
Et elle existera à nouveau, c'est juste temporaire.


 
vu dans se sens la oui, PHP 7 aussi  :lol:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed