Problème avec substr et dernier caractère...

Résolu
hoppl -  
 maxou1242 -
Bonjour,

J'ai un petit souci avec un code en PHP. Pour expliquer, J'ai un module qui affiche les titres des nouvelles tirées d'une BD. Je substr les chaines pour n'avoir que 28 caractères avec ..., par manque d'espace.

Tout s'affiche bien, le UTF-8 fonctionne, tous les caractères spéciaux sont correct, sauf quand le dernier caractère avant la coupe est un caractère spécial: (ex: é à è ç), etc...

Par exemple:
$string = "Un accident fait deux blessés graves";
$string = substr($string, 0, 28);


donne: Un accident fait deux bless�

Si je coupe à 29, tou va bien....
Je sais que je pourrais faire ma coupe sur un espace, mais comme c'est déjà très court, je n'aurais des texte que de 2-3 mots...

Quelqu'un a une idée du problème ou une solution..??
Merci.
A voir également:

5 réponses

hoppl
 
En fait, t'as raison en parti, mais tort en parti.

C'est bel et bien un problème de multi-octet (multi-byte).

Mais on est pas pris avec ce problème. Avec un peu de recherche et d'essai erreur, j'ai réussi à changer mon code pour qu'il prenne en compte les multi-bytes:

Donc:
$string = substr($string, 0, 28);


Devient:
$string = mb_substr( $string, '0', '28', 'UTF-8' );
4
Utilisateur anonyme
 
re :

... En fait, t'as raison en parti, mais tort en parti. ...


Si cela peut te faire plaisir :-)

On y changeras rien, l'UTF8 est ainsi structuré.

Lupin
1
Utilisateur anonyme
 
Bonjour,

en fait j'ai rencontré le même phénomène sur une gros logiciel HP OverView ServiceCenter
convertie à l'UTF8. Tous les caractères spéciaux sont codés sur 2 octets. Faut faire avec :-)

Lupin
0
hoppl
 
J'ai oublié: Un gros merci de m'avoir mis sur la bonne piste...!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maxou1242
 
Pour régler le problème, il faut utiliser la fonction mb-substr. string mb_substr ( string str , int start , int length , string encoding )

mb_substr retourne la portion de la chaîne str qui commence au caractère start et a la longueur de length caractères.

mb_substr effectue une recherche de type strpos , en tenant compte des caractères multi-octets. La position de needle est comptée à partir du début de la chaîne haystack : les positions commencent à 0.

Si encoding est omis, l'encodage interne est utilisé. encoding est un nom d'encodage de caractères. S'il n'est pas spécifié, l'encodage interne est utilisé.


Par exemple, on remplacera substr($texte,0,300) par mb_substr( $texte, '0', '300', 'UTF-8' ).
0