Problème d'extraction de chaîne contenant "ù"

mik
Invité n'ayant pas de compte PHPfrance

09 nov. 2012, 11:14

Bonjour,

Désolé par avance si la réponse à ce problème a sans doute été déjà trouvée, mais j'ai beau cherché dans plusieurs forums et aucune solution proposée ne parvient à résoudre mon problème. Tout ça pour dire que j'ai cherché avant de créer le post.

Le problème est simple, voici le code :
<?php 

$string = "Où vas-tu ?";

$lg = strlen($string);

$ou = substr($string,0,2);
$ou2 = htmlentities($ou);

echo "Longueur de chaîne : ".$lg."<br>
		Chaîne : ".$string."<br>
		Le substr : ".$ou."<br>
		Le htmlentities : ".$ou2;

?>
Cela m'affiche :
Longueur de chaîne : 12
Chaîne : Où vas-tu ?
Le substr : O�
Le htmlentities : OÃ
Je voudrais bien entendu récupérer "Où".

Pourquoi la chaîne est-elle plus longue de 1 ?

Si je fais :
<?php 

$string = "tudoù";

$lg = strlen($string);

$ou = substr($string,4,2);
$ou2 = htmlentities($ou);

echo "Longueur de chaîne : ".$lg."<br>
		Chaîne : ".$string."<br>
		Le substr : ".$ou."<br>
		Le htmlentities : ".$ou2;

?>
J'obtiens :
Longueur de chaîne : 6
Chaîne : tudoù
Le substr : ù
Le htmlentities : ù
Donc le "ù" avec le substr.

Je vous avoue que je n'y comprends rien... Le "ù" occuperait-il deux caractères ?

Merci pour tous les éclaircissements que vous pourriez m'apporter.

Mikael

ViPHP
ViPHP | 2577 Messages

09 nov. 2012, 11:31

Peut être qu'en précisant le charset dans le "head" de la page, comme par exemple : <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

mik
Invité n'ayant pas de compte PHPfrance

09 nov. 2012, 11:49

Merci pour la réponse.

Hélas cette ligne est déjà présente dans le <head>.

J'ai aussi essayé plusieurs fonctions sur les chaînes comme utf8_decode, utf8_encode, ou encore récupérer le code ASCII du caractère pour ensuite le reconvertir en lettre, mais rien n'y fait.

Mikael

ViPHP
ViPHP | 2577 Messages

09 nov. 2012, 12:08

Il y a éventuellement le problème du charset de ton PC et donc du "ù" que tu as dans ton fichier.

Pour éviter certain problème, regarde le source html plutôt que l'affichage du navigateur.

Tu peux également faire & ugrave; => ù => & ugrave; avec html_entity_decode()/htmlentities()

Eléphant du PHP | 267 Messages

09 nov. 2012, 12:10

salut,

en UTF8, tous les caractères ne sont pas encodés avec le même nombre d'octets
par exemple, le caractère 'a' est codé sur 1 octet mais le caractère 'ù' est codé sur 2 octets
ce qui explique, les résultats obtenus avec la fonction strlen()

donc il faut faire :
<?php
$string = "Où vas-tu ?";

$lg = strlen(utf8_decode($string));

$ou = mb_substr($string,0,2, 'UTF8');
$ou2 = htmlentities($ou);

echo "Longueur de chaîne : ".$lg."<br>
                Chaîne : ".$string."<br>
                Le substr : ".$ou."<br>
                Le htmlentities : ".$ou2;
@+
dix2

mik
Invité n'ayant pas de compte PHPfrance

09 nov. 2012, 12:46

OUAHHHHHHHHHH...

6 heures de recherches hier soir... et une solution rapide sur le forum.

Merci beaucoup pour votre aide, cela fonctionne à merveille. Je vais de ce pas étudier la fonction mb_substr de plus près.

Mikael

Mammouth du PHP | 2278 Messages

09 nov. 2012, 17:56

pour avoir la paix:
mb_internal_encoding( 'UTF-8');
avant toute chose; mais j'ai fini par convertir toutes mes chaines en tableaux et à créer moi même toutes les fonctions dont j'avais besoin
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 2 Messages

09 nov. 2012, 18:59

Merci pour cette précision.

Mikael