substr et caracteres spéciaux

substr et caracteres spéciaux - PHP - Programmation

Marsh Posté le 25-05-2008 à 21:36:33    

Bonjour,
 
Je souhaite couper cette chaine:

Citation :

"Le Northrop B-2 Spirit est un bombardier stratégique et l'un des plus célèbres avions furtifs actuels des États-Unis."


au 52ème caractere. Mais en faisant ça:

Code :
  1. $str = substr($str,0,52).'...';


 
Substr me retourne ça:  

Citation :

Le Northrop B-2 Spirit est un bombardier strat&eacut...


J'ai regardé en coupant au 54ème caractère ça passe, mais sinon non.
 
Substr a l'air de mal gérer les caractères spéciaux. Quelqu'un a une idée du problème?
 
A+


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 25-05-2008 à 21:36:33   

Reply

Marsh Posté le 25-05-2008 à 21:48:57    

Le probleme vient du "é" qui est apparament decomposé par substr comme  étant un caractere special. Mais je capte pas pourquoi il fait ca...


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 25-05-2008 à 21:57:34    

chez moi ça marche bien.
 
elle vient d'où ta chaine ? il n'y a pas déjà é dedans ?


---------------
oui oui
Reply

Marsh Posté le 26-05-2008 à 07:07:29    

Non, a l'origine non. Mais je sais pas pourquoi ce substr transforme le é en é


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 26-05-2008 à 08:23:52    

Non impossible, substr ne fait pas ce genre de transformation.
Es-tu certain du contenu de ta chaîne? Si tu fais un echo de la chaîne que tu passes à substr tu obtiens quoi? Penses à bien regarder la source de la page si tu es sur du web.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 26-05-2008 à 08:40:39    

Oui, j'ai fait ce test. Juste avant le substr j'ai "Le Northrop B-2 Spirit est un bombardier stratégique" et juste après mais uniquement quand je coupe au 52ème caractère, il me sort "Le Northrop B-2 Spirit est un bombardier strat&eacut...".
 
Si je coupe au 54ème caractère, tout est ok. C'est comme si pour lui le "é" représentait plusieurs caractères...


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 26-05-2008 à 09:21:26    


Arf! Pas bete. J'vais tester. :) Merci! :jap:


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 26-05-2008 à 11:07:04    

Ill Nino a écrit :

Substr me retourne ça:  

Citation :

Le Northrop B-2 Spirit est un bombardier strat&eacut...



T'es pas censé avoir des entités (genre &eacute) à ce niveau là. Les entités ne sont nécessaires que tout à la fin, lors de l'affichage dans une page HTML, et encore s'il y a des problèmes d'encoding. Utilise html_entity_decode() (en faisant bien gaffe à l'encoding) pour avoir un truc propre.
 
Ensuite si tu choisis l'utf-8, essaye d'avoir l'extension mbstring d'installée, pour utiliser plutôt la fonction mb_substr

Reply

Marsh Posté le 26-05-2008 à 11:10:33    

FlorentG a écrit :


T'es pas censé avoir des entités (genre &eacute) à ce niveau là. Les entités ne sont nécessaires que tout à la fin, lors de l'affichage dans une page HTML, et encore s'il y a des problèmes d'encoding. Utilise html_entity_decode() (en faisant bien gaffe à l'encoding) pour avoir un truc propre.
 
Ensuite si tu choisis l'utf-8, essaye d'avoir l'extension mbstring d'installée, pour utiliser plutôt la fonction mb_substr


Le "é" comme ca c'est pas plutot a decoder par htmlspecialchars_decode()?


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 26-05-2008 à 11:14:02    

Ill Nino a écrit :


Le "é" comme ca c'est pas plutot a decoder par htmlspecialchars_decode()?


htmlspecialchars c'est uniquement les caractères spéciaux (& < > " '), pas les entités en dehors de ça :)


Message édité par FlorentG le 26-05-2008 à 11:14:25
Reply

Marsh Posté le 26-05-2008 à 11:14:02   

Reply

Marsh Posté le 26-05-2008 à 11:20:39    

Arf! J'ai pas compris le truc alors. "é" c'est une entité et pas un caractère spécial?


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 26-05-2008 à 11:23:17    

Ill Nino a écrit :

Arf! J'ai pas compris le truc alors. "é" c'est une entité et pas un caractère spécial?


Nan. Je me suis mal exprimé en fait :D
 
é c'est un caractère, et &eacute; une entité. Maintenant y'a quelques entités de base : &amp; &lt; &gt; &quot;. Celle-là sont générée par htmlspecialchars, et décodées par htmlspecialchars_decode.
 
Ensuite y'a les entités pour les caractères (pas forcément spéciaux) : &eacute; &egrave;. Celles-là sont gérées par htmlentities et htmlentities_decode.

Reply

Marsh Posté le 26-05-2008 à 11:25:29    

Ah ok. D'accord. Donc en gros si c'est (& < > " ') faut htmlspecialchars et pour tout le reste c'est htmlentities. C'est ca? :D


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 26-05-2008 à 11:42:42    

Yes. Note que htmlentities fait aussi htmlspecialchars, donc faut pas faire les deux.
 
Si tu maîtrise bien ton encoding, t'as pas besoin d'htmlentities, t'aura juste besoin de faire un htmlspecialchars pour éviter de pouvoir injecter n'importe quoi dans la page

Reply

Marsh Posté le 26-05-2008 à 11:45:14    

OK. D'ailleurs ce truc de l'encoding j'ai pas vraiment compris non plus. C'est quoi les UTF-8 et compagnie? Vaste question p'etre non? :/


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 26-05-2008 à 11:46:57    

Note aussi que la solution de NazzTazz est la meilleure. Imagine la phrase :

Citation :

Ill Nino est content des réponses qu'on lui a donné


Imagine tu ne gardes que les 16 premiers caractères, ça donne :

Citation :

Ill Nino est con


Pas top :D

Reply

Marsh Posté le 26-05-2008 à 11:49:37    

:D C'est clair. Elle me va parfaitement sa solution! :jap:


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 26-05-2008 à 14:35:01    

FlorentG a écrit :

Note aussi que la solution de NazzTazz est la meilleure. Imagine la phrase :

Citation :

Ill Nino est content des réponses qu'on lui a donné


Imagine tu ne gardes que les 16 premiers caractères, ça donne :

Citation :

Ill Nino est con


Pas top :D


L'encoding c'est ce qui se déclare dans le HEAD de la page c'est ça? Utf-8 c'est le plus répandu?


---------------
Faut qu'on court comme des lions, des tigres et des ours!
Reply

Marsh Posté le 22-12-2009 à 11:45:50    

Salut NazzTazz et merci pour ta fonction.
 
Mais STRREV ne fonctionne pas avec UTF-8 : cf. http://www.php.net/manual/fr/function.strrev.php#52788

Reply

Sujets relatifs:

Leave a Replay

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