Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/06/2011, 14h05   #1
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 65
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 65
Points : 27
Points : 27
Par défaut Un petit problème de caractères & tableau

Bonjour,

Etant en train de réaliser un petit jeu du pendu (pour un site d'école) je me trouve devant un problème bizarre, et après deux jour de recherche infructueuse et de multiple test je ne sais plus quoi faire voila le contexte:

1) j'ai une table qui contient les mots:
Citation:
CREATE TABLE IF NOT EXISTS `pendu` (
`id` mediumint(11) NOT NULL AUTO_INCREMENT,
`mot` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `mot` (`mot`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--
-- Contenu de la table `pendu`
--

INSERT INTO `pendu` (`id`, `mot`) VALUES
(1, 'aimer'),
(2, 'accumulation'),
(3, 'arbre'),
(4, 'affreusement'),
(5, 'appendicectomie'),
(6, 'détestablement'),
(7, 'infrastructure'),
(8, 'presbytérianisme'),
(9, 'préromantisme'),
(10, 'sous-développement'),
(11, 'taxidermiste'),
(12, 'tartan'),
(13, 'vaniteuseument'),
(14, 'zostérienne'),
(15, 'zoogéographie');
Donc le but est de contrôler si la lettre demandée est bien présente dans le mot puis de la replacer (je précise que pour toutes les lettres sans accent et autre pas de problème cela fonctionne) mais impossible de comparer un é... dans le mot.
A la base j'utilisai la fonction
Code :
if(substr($_SESSION['mot'],$j,1)==$_GET['lettre'])
mais alors que mon $_GET me retourne bien un é pas de réponse positive donc j'ai commencé à faire des echo, des var_dump pour me rendre compte qu'un é ou è était interprété par la fonction si-dessus en � donc me voila partie dans de multiples tests (je pense avoir fait toutes les fonctions du genre) qui reste infructueux genre:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
	$_SESSION['mot']=$req['mot']; /* exemple avec un retour mysql du mot zoogéographie */
$tab_mot=str_split($req['mot']); /* mise en array du mot zoogéographie */
var_dump($tab_mot);/* affichage du tableau par la fonction str_split() qui bogue sur les accents */
echo '<br/><br/>'.implode("", $tab_mot).'<br/><br/>'; /* réaffichage du tableau en mot qui est OK */
foreach($tab_mot as $value)/* reconstitution du mot par la fonction foreach qui bogue */
{
	echo $value.' ';
}
/* équivalent des action précédente mais cette fois sur base d'un array de suite et la tout fonctionne */
$tab_mot2=array('é','ê'); /* création d'un tableau */
echo '<br/><br/>';
var_dump($tab_mot2);
echo '<br/><br/>'.implode("", $tab_mot2).'<br/><br/>';
foreach($tab_mot2 as $value)
{
	echo $value.' ';
}
?>
Avec ce type d'affichage:
Par contre si je met un é ou à ou ç dans un array() dès le départ (ou en utilisant la fonction explode) alors la pas de problèmes je les réaffiche bien correctement.
(voir image en pj)
Je précise que concernant la configuration tout est en UTF-8 BD,MYSQL,PAGE,(y compris apache pour ce site via le httpd.conf).

J'ai aussi fait d'autre test en jouant avec les fonctions mb_... en forçant le mb_internal_encoding('UTF-8'); de php mais toujours le même résultat (hormis le comptage par mb_strlen($var) qui retourne bien le bon nombre de caractères.
Images attachées
Type de fichier : jpg 320257.jpg (25,8 Ko, 0 affichages)
e-m.guillaume est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 17h24   #2
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par e-m.guillaume Voir le message
Je précise que concernant la configuration tout est en UTF-8 BD,MYSQL,PAGE,(y compris apache pour ce site via le httpd.conf).
Oui mais il y a nécessairement une étape qui manque ou qui ne fonctionne pas comme attendu car c'est typiquement un problème d'encodage. Un tuto ici
Si ce n'est déjà fait essayes en haut dans ton code php
Code :
header( 'content-type: text/html; charset=utf-8' );
et juste après ta connexion à la bdd et avant les requêtes.
Code :
mysql_set_charset( 'utf8' );
ou (suivant la version de mysql et de php) une requête avec
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 19h03   #3
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 65
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 65
Points : 27
Points : 27
re,

Oui c'est aussi ce que j'ai pensé au début donc j'ai complété mon test avec des mots rentré directement dans le code (et j'avais aussi essayé le coup du header() car j'avais ton lien dans mes tablette, mais rien n'y fait exemple avec cette autre test fait:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
<?php 
header( 'content-type: text/html; charset=utf-8' );
$mot_test='éèàçöô';
	/* on réalise ici l'action à faire avec les données du formulaire une fois que tout est OK */
	echo '<h1>Bravo votre formulaire est bien rempli l\'action est faite</h1><br/>';
	echo 'votre mot saisi:'.htmlspecialchars($mot_test,ENT_QUOTES).'<br/><br/><a href="">recommencer</a><br/><br/>';
	/* test des tableaux */
	$tab_mot=mb_split('',$mot_test);
	$mot='';
	$mot1=array();$mot2=array();
	foreach($tab_mot as $value)
	{
		echo $value.'';
		$mot.=$value.'1';
		$mot1[]=$value;
	}
	echo '<br/><br/> affichage de mot du foreach: '.$mot;
	echo '<br/><br/>';var_dump($mot);
	echo '<br/><br/> affiche le mot1';var_dump($mot1);
	for($i=0;$i<mb_strlen($mot_test);$i++)
	{
		$mot2[]=$mot_test[$i];
	}
	echo '<br/><br/>';var_dump($mot2);
?>
qui me retourne cela comme résultat:
voir image en pj
Images attachées
Type de fichier : jpg 321428.jpg (51,7 Ko, 0 affichages)
e-m.guillaume est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 19h17   #4
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur Web
Inscription : décembre 2006
Messages : 2 335
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2006
Messages : 2 335
Points : 3 774
Points : 3 774
Salut,
tu peux toujours trouver des conseils pour les problèmes d'encodage dans l'article Comment encoder votre site intégralement en UTF-8.
__________________
Développeur | Zend Certified Engineer

Étapes Pour mieux se servir du forum:
1. Commencez par lire les cours et tutoriels ;
2. Faites une recherche;
3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

Nix>_Rien n'est plus pratique que la théorie
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 21h11   #5
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 65
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 65
Points : 27
Points : 27
re,

Citation:
Envoyé par Thes32 Voir le message
Salut,
tu peux toujours trouver des conseils pour les problèmes d'encodage dans l'article Comment encoder votre site intégralement en UTF-8.
Merci du lien, mais comme je l'ai déjà dit tout ce qui est donné dans ce tuto est en application (voir même plus). Après c'est peut être un bogue de la version php que j'utilise pour windows 64bits en version php5.3.6
e-m.guillaume est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 21h54   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Il faudrait peut être indiquer que c'est de l'UTF-8 :
* les fonctions mbstring : il faut le préciser en paramètre sinon en faire la déclaration préalable via mb_internal_encoding('UTF-8')
* htmlspecialchars : nom de l'encodage en 3e paramètre

Mais surtout ceci est faux :
Avec [index] vous accédez à un octet de la chaîne. Or UTF-8 représente un caractère Unicode sur 1 à 4 octets, donc c'est parfaitement normal d'obtenir cette sortie incohérente si vous découpez sur les unités de code au lieu des points de code. Il faut passer par mb_substr ou mb_split par exemple, comme vous le faisiez plus tôt d'ailleurs, pour justement passer cette "limitation" de PHP.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 16h45   #7
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Ah oui, julp a bien vu le pb. C'est ton test qui est incorrect ! Pour faire des choses assez similaires, tu peux regarder les messages de contribution dans cette page.

A noter qu'il y a aussi la fonction strtr (assez couramment employée dans d'anciens scripts) qui pose problème avec l'utf8, à remplacer par str_replace.
Concernant htmlspecialchars, bien qu'il soit recommandé de spécifier l'encodage comme pour toutes les fonctions travaillant sur les chaines de caractères, si tu utilise l'utf-8 tu n'es pas obligé de le faire car cela ne pose généralement aucun problème pour cette fonction (aucun connu pour l'instant).
Citation:
htmlspecialchars

Official documentation: htmlspecialchars
Risk: low
Impact: in theory (not confirmed) should not damage a UTF-8 string

htmlspecialchars should (not confirmed) do the right thing by default (without the third argument specifying UTF-8) if it is given a well formed UTF-8 string because the characters it replaces are all within the ASCII 7 range.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 18h17   #8
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 65
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 65
Points : 27
Points : 27
Re,
Effectivement la seul fonction qui m'a échappé dans les mb_xxx alors que c'était bien d'elle d'on j'ai besoin (d'autant que comme j'ai mon propre serveur j'ai configuré le mb_internal_encoding() en UTF-8 par défaut sur le serveur).

Merci à vous tous.
e-m.guillaume est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h28.


 
 
 
 
Partenaires

Hébergement Web