Bonjour les petits lous,

Venant d'installer un petit serveur apache avec php (Apache/2.2.8 (Win32) PHP/5.2.5), je rencontre actuellement un problème d'encodage concernant seulement les pages d'un blog dotclear : http://labo.arthak.com/marco/index.php?2008/04/24/1-first-post

J'ai ajouté la petite ligne magique :
AddDefaultCharset utf-8


à mon fichier de configuration apache.

Et tout mes fichier ont étés sauvegardés en utf-8, ce qui à pour résultat qu'aucune de mes pages n'a de problèmes d'encodage, à par ce module. Je me tourne vers vous car j'ai épongé tout les forum et documentations Dotclear

Lui même renvoi une en tête en :

HTTP/1.1 200 OK
Date: Thu, 24 Apr 2008 22:54:18 GMT
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Last-Modified: Thu, 24 Apr 2008 22:39:33 GMT
Cache-Control: must-revalidate, max-age=0
Pragma: 
Content-Length: 4337
Connection: close
Content-Type: text/html; charset=UTF-8
 


et comprend astucieusement :

<?php
header('Content-Type: text/html; charset=utf-8');
?>
...
<?xml version="1.0" encoding="UTF-8"?>
...
	<meta http-equiv="Content-Type"
	content="text/html; charset=UTF-8" />

 


Les bases de données SQL contenant ces posts contienent cependant dans la colonne interclassement la mention : latin1_swedish_ci

Les caractère accentués ne sont pas pris en compte autrement que par des ?, ce qui d'après un diagnostique alsa represente un conflit entre utf-8 et iso... Quelqu'un à-t-il une idée ?
Bonjour,

Oui il peut s'agir d'un problème d'encodage de la base de données elle même. J'ai eu un souci similaire récemment que j'ai résolu en plaçant cette petite ligne de code juste après la connexion à la base.

mysql_query("SET NAMES 'utf8'", $connect);
Non apparemment après avoir appliqué ton :


$this->con_id = @mysql_connect($alias, $user, $pwd);
mysql_query("SET NAMES 'utf8'", $this->con_id);


Je me retrouve avec des encodages encore plus bizarre: ?«±?«±

Et une impossibilité de poster des commentaires :

 MySQL : 1366 - Incorrect string value: '\x8F\xAB\xB1t\x8F\xAB...'
 for column 'comment_auteur' at row 1


Pour le mot : "été". Smiley confus
Modifié par arthak (25 Apr 2008 - 12:49)
Bonjour,

1. Version de MySQL?
2. Paramètres par défaut de MySQL pour l'encodage (ça peut se voir avec phpMyAdmin par exemple, et il doit y avoir sept ou huit lignes...)?
3. Interclassement (collation) indiqué pour les différentes tables?
4. Que donne un script PHP simple qui interroge la base de données pour en récupérer le contenu, avec un "SET NAMES utf8", un "SET NAMES latin1", et sans aucune de ces deux requêtes?
# Version du client MySQL: 5.0.45

Jeu de caractères pour MySQL: UTF-8 Unicode (utf8)

Interclassement pour la connexion MySQL: utf8_unicode_ci


<?php
	$link = mysql_connect('localhost','root','***');
	mysql_select_db("test");
	// ... connexion
	$sql  = mysql_query("select a from mop");
	if (!$sql) {
	    die('fRequete invalide : ' . mysql_error());
	}
	$mo = mysql_fetch_assoc($sql);

	echo $mo['a'];
?>


renvoi "&#65533; " ("?" sous windows)

avec
	mysql_query("SET NAMES 'utf8'");

renvoi "é"


	mysql_query("SET NAMES latin1");


renvoi "&#65533; " ("?" sous windows)

Je n'ai pas retrouvé les Paramètres par défaut de MySQL pour l'encodage sous PhpMyAdmin. J'ai cependant quelques variables serveurs:
character set client utf8
(Valeur globale) latin1
character set connection utf8
(Valeur globale) latin1
character set results utf8
(Valeur globale) latin1
collation connection utf8_unicode_ci
(Valeur globale) latin1_swedish_ci
collation database latin1_swedish_ci
collation server latin1_swedish_ci

Qu'est ce que ca veux dire docteur ?
Modifié par arthak (25 Apr 2008 - 14:02)
arthak a écrit :
renvoi "&#65533; " ("?" sous windows)

La page étant interprétée par le navigateur avec quel encodage?

arthak a écrit :
renvoi "é"

Même question.

Et question idiote: Dotclear est bien configuré pour utiliser UTF-8?

Pour qu'une application utilisant une base en UTF-8 marche bien, il faut:
- des données enregistrée en UTF-8;
- des données marquées comme UTF-8 (si tes tables ont pour interclassement "latin1", ça n'est pas le cas);
- une connection avec le serveur MySQL en UTF-8 (c'est à ça que sert le "SET NAMES utf8", nécessaire ici car le serveur MySQL est configuré pour une connexion par défaut en ISO-8859-1);
- une application qui envoie des données (billet ou commentaire saisi, par exemple) en UTF-8;
- une application qui n'utilise pas les fonctions PHP qui «corrompent» ou convertissent l'encodage (exemple: htmlspecialchars() sans indication de l'encodage UTF-8 en paramètre).

Éventuellement, ça peut marcher avec des données en UTF-8 dans des tables en latin1 et avec une connection en latin1: comme les tables sont indiquées en latin1, MySQL ne fait pas de conversion et l'application peut y stocker des données UTF-8 et les récupérer telles-quelles. Je ne sais pas si Dotclear 1 fonctionne ainsi par défaut...

Quoi qu'il en soit, je suis un peu étonné par ce qui s'affiche sur le blog car les caractères qui posent problème n'ont pas l'air d'être en latin1 ou windows1252 ou MacRoman, alors qu'ils ne sont pas en UTF-8. Les données ont l'air d'être corrompues à un stade ou un autre, mais là je ne vois pas où...
Mon naviguateur firefox 3b0.5 encodé en UTF-8 sous léopard.

La page est encodé en UTF-8 et le script sauvegardé en UTF-8 (sans BOM) pour les 3 tests.

Dotclear est effectivement configuré pour utiliser UTF-8 ^^.

Cependant, lors de l'exécution d'un script de brainstorming qui illustre très bien le problème ( http://labo.arthak.com/brainstorm/code.txt , à exécuter http://labo.arthak.com/brainstorm/ ), je remarque le même problème. La page et bien enregistrée en UTF-8 mais en revanche sans header ni balise appréciant l'encodage. et ajouter mysql_query("SET NAMES utf8"); n'arrange rien car provoque une erreur de même type que la précédente :

f67.Requete invalide : Incorrect string value:
 '\x8F\xAB\xB1' for column 'motr' at row 1


le f67 étant le code repère de la requète provoquant l'erreur en l'occurrence la requête d'insert du mot. Le problème vient donc sans aucun doute de MySQL et sans doute donc de moi qui ai du changer des données de configuration car le problème n'était pas effectif auparavant. Mais de la à savoir quoi modifier...

EDit : En reprenant le mot posté avant de le stocké, je m'aperçoit qu'il est mal encodé avant d'être stocké. C'est donc l'encodage des données lors de leurs "envoi" d'une page à une autre. Donc on revient à apache ou php...

peut être une solution de ce coté la http://fr.php.net/manual/fr/mbstring.http.php en effet le problème est présent depuis que j'ai activé mbstring dans la config php.

SOLUTION

Modifier ces valeur dans le PHP.INI, ce qui revient à désactiver la conversion HTTP :

mbstring.http_input = pass
;on à remplacé auto par pass
...
mbstring.encoding_translation = Off
;On passe ca à Off


Je n'avai pas fait le lien..
Modifié par arthak (26 Apr 2008 - 12:33)